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

0 0
原创粉丝点击