About iOS总结
来源:互联网 发布:linux gcc安装包 编辑:程序博客网 时间:2024/06/06 19:31
1.数据持久化存储方案有哪些?
plist文件(属性列表)
属性列表是一种明文的轻量级存储方式,其存储格式有多种,最常规格式为XML格式。在我们创建一个新的项目的时候,Xcode会自动生成一个info.plist文件用来存储项目的部分系统设置。plist只能用数组(NSArray)或者字典(NSDictionary)进行读取,由于属性列表本身不加密,所以安全性几乎可以说为零。因为,属性列表正常用于存储少量的并且不重要的数据。在程序启动后,系统会自动创建一个NSUserDefaults的单例对象,我们可以获取这个单例来存储少量的数据,它会将输出存储在.plist格式的文件中。其优点是像字典一样的赋值方式方便简单,但缺点是无法存储自定义的数据。
NSKeyedArchiver(归档)
与属性列表相反,同样作为轻量级存储的持久化方案,数据归档是进行加密处理的,数据在经过归档处理会转换成二进制数据,所以安全性要远远高于属性列表。另外使用归档方式,我们可以将复杂的对象写入文件中,并且不管添加多少对象,将对象写入磁盘的方式都是一样的。使用NSKeyedArchiver对自定义的数据进行序列化,并且保存在沙盒目录下。使用这种归档的前提是让存储的数据模型遵守NSCoding协议并且实现其两个协议方法。(当然,如果为了更加安全的存储,也可以遵守NSSecureCoding协议,这是iOS6之后新增的特性)
CoreData
coreData是苹果官方iOS5之后推出的综合型数据库,其使用了ORM(Object Relational Mapping)对象关系映射技术,将对象转换成数据,存储在本地数据库中。coreData为了提高效率,甚至将数据存储在不同的数据库中,且在使用的时候将本地数据放到内存中使得访问速度更快。我们可以选择coreData的数据存储方式,包括sqlite、xml等格式。但也正是coreData 是完全面向对象的,其在执行效率上比不上原生的数据库。除此之外,coreData拥有数据验证、undo等其他功能,在功能上是四种持久化方案最多的。
SQLite
sqlite是一个轻量级、跨平台的小型数据库,其拥有可移植性高、有着和MySql几乎相同的数据库语句以及无需服务器即可使用的优点:一、可以存储大量的数据,存储和检索的速度非常快;二、能对数据进行大量的聚合,这样比起使用对象来进行这些操作要快。当然,它也具有明显的缺点:一、它没有提供数据库的创建方式;二、它基于C语言框架设计,没有面向对象的API,所以使用起来比较麻烦;三、复杂的数据模型的数据建表相对而言比较麻烦。当然,我们也可以使用基于sqlite封装的开源数据库FMDB来减少使用sqlite的工作量
基于sqlite封装的FMDB几乎是我工作中最常用到的持久化方案。在实际开发中,sqlite占用的内存非常非常的少,在嵌入式设备中,可能只需要几百K即可。其次,它的速度非常的快,几乎快过所有其他的数据库。当然啦,开始使用数据库进行开发之前,你得了解sqlite支持的数据类型,包括NULL(空值)、Integer(整型)、Real(实数)、Text(字符串)、BLOB(二进制)
在使用sqlite前要导入libsqlite3.0框架,然后导入<sqlite3.h>头文件。其操作步骤大致如下:
1、使用sqlite3_open(const char *filename, sqlite3 **ppDb)方法打开指定路径下的数据库存入到创建的数据库变量中,如果存在数据库就打开。不存在数据库则关闭。成功打开数据库的时候会返回SQLITE_OK
static NSString * const dbName = @"myDBText.db";NSString * documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];NSString * filePath = [documentDirectory stringByAppendingPathComponent: dbName];if (SQLITE_OK == sqlite3_open(filePath.UTF8String, &_database)) {NSLog(@"数据库打开成功!");} else {NSLog(@数据库打开失败!“);}2、执行SQL语句。有返回值的语句执行第四步,无返回值的执行第三步
3、对于无返回值的SQL语句(包括增删改等操作)通过sqlite3_exec()函数执行
char * error;NSString * executeSql = @"select * from table student where name like '张%'";if (SQLITE_OK != sqlite3_exec(_database, executeSql.UTF8String, NULL, NULL, &error)) {NSLog(@"执行SQL语句过程发生错误!");}4、对于有返回值的SQL语句首先通过sqlite3_prepare_v2()进行语法评估,然后通过sqlite3_step()函数依次取出查询结果的每一行数据,最后通过sqlite3_column_type()方法获取对应列的数据
NSMutableArray * rows = [NSMutableArray new];sqlite3_stmt * stmt; //检查语法正确性if (SQLITE_OK == sqlite3_prepare_v2(_database, executeSql.UTF8String, -1, &stmt, NULL)) {//单步执行sql语句while (SQLITE_ROW == sqlite3_step(stmt)) {int columnCount = sqlite3_column_count(stmt); //获取列数NSMutableDictionary * dic = [NSMutableDictionary dictionary];for (int i = 0; i < columnCount; i++) {const char * name = sqlite3_column_name(stmt, i); //取到列名const unsigned char * value = sqlite3_column_text(stmt, i); //取得某列的值dic[[NSString stringWithUTF8String: name]] = [NSString stringWithUTF8String: (const char *)value];}[rows addObject: dic];}}sqlite3_finalize(stmt);
sqlite的原生语句对于开发者而言有时是一个灾难,在熟练使用之前,我们很难保证数据库的语句和执行代码没有任何问题。对此,我们可以在github上面找到基于sqlite3封装的FMDB,它提供了特有的机制来保证数据库访问是线程安全的,至于使用方法在网上一搜一大把教程,这里就不在细说。但是,使用FMDB有一个要注意的问题是——当我们把图片转换成二进制数据存储在数据库中的时候,再次读取出这个二进制数据初始化成图片的时候会出错误,无法正常转换成图像。解决方案详见这里http://mobile.51cto.com/hot-405287.htm
参考:http://www.jianshu.com/p/86ea6da905cf
2.沙盒的目录结构是怎样的?各自一般用于什么场合?
在程序中可以通过NSHomeDirectory()获取程序的沙盒路径
documents:一般用来存放应用中建立的文件,如数据库文件,或程序中浏览到的文件数据。如果进行备份会将此文件夹中的文件包括其中;
Library/Preferences:存储应用的默认设置及状态信息;
Library/Cache:用来存放缓存文件,此文件夹下数据在应用退出时不会删除。备份时不会包括此文件夹;
tmp:存放即时创建的临时文件
3.如何处理多个网络请求并发的情况?
参考:http://www.cnblogs.com/yanhuaxuanlan/p/4683557.html
http://blog.csdn.net/michaelKiven/article/details/49148821
http://ikinglai.blog.51cto.com/6220785/1262749
4.NSThread中的RunLoop的作用,如何使用?
Run Loop就是个监听事件的循环,会不停的检查它的事件源(Timer和Input Source)有没有事件发生,如果有事件发生就处理事件或者调用事件的处理方法。
Run Loop的使用场合:
1. 使用port或是自定义的input source来和其他线程进行通信
2. 在线程(非主线程)中使用timer
3. 使用 performSelector…系列(如performSelectorOnThread, …)
4. 使用线程执行周期性工作
参考:http://blog.ibireme.com/2015/05/18/runloop/
http://www.hrchen.com/2013/07/tricky-runloop-on-ios/
5.内存中红得栈和堆的区别是什么?哪些数据在栈上,哪些在堆上?
管理方式:堆由程序员管理;栈由编译器自动管理;
大小:堆是向高地址扩展的数据结构(不连续);栈是向低地址扩展的数据结构(连续);
碎片:堆容易造成碎片;
分配:堆是动态分配(人工释放);栈可静态分配和动态分配(自动释放);
效率:栈比堆效率高。
通常是局部变量、函数参数等存放在栈中;
6.runtime的概念,message send如果寻找不到相应的对象,会如何进行后续处理?
动态方法解析 resolveThisMethodDynamically
消息转发 forwardingTargetForSelector
- About iOS总结
- About iOS App Programming
- Misconceptions About iOS Multitasking
- iOS: About split view
- iOS notes about url
- iOS: memory leak about "strdup"
- About iOS webview load commpletly
- [ios] compile exception about ARC
- iOS开发-About StoryBoard
- 大家都要写总结~about 省赛
- [IOS/翻译]About the iOS Technologies
- iOS开发KVC——what is about kvc and how to use it ? (总结更新版)
- more interesting new about IOS and Android
- iOS: Some issues about push notification
- iOS: About app icon and splash image
- ios: Some issues about push notification
- About Table Views in iOS-Based Applications
- About Table Views in iOS Apps
- C# winform 编写一键排班软件时遇到的问题
- 【贪心】Bzoj 2457:[BeiJing2011]双端队列
- 企业账号发布应用
- java 集合(3) set 接口/ set 常用算法
- 超级 Ping 监测工具——为您的网络状态保驾护航
- About iOS总结
- sscanf用法
- c语言之遗漏---标准C的标记化结构初始化语法
- 贪心法求解背包问题
- android基础学习之activity(一)
- 全局服务器负载均衡(GSLB)简介
- absolute 元素的百分比宽高
- WIN+R技巧大全
- vijos 1172反质数