几个偏基础的面试题
1、iOS本地数据存储都有哪几种方式?
2、深拷贝和浅拷贝的理解?
3、什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储?
4、谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
我有一个iOS免费内推交流群,群里有群员内推,有面试交流,有技术讨论,有需要的加群:637919808
群内交流情况:
内推
1、iOS本地数据存储都有哪几种方式?
NSKeyedArchiver
NSUserDefaults
Write写入方式(plist文件、txt文件等)
SQLite3
CoreData
(问题扩展:什么情况下使用什么样的数据存储)
(1)NSKeyedArchiver:采用归档的形式来保存数据,数据对象需要遵守NSCoding协议,对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。缺点:只能一次性归档保存以及一次性解压。所以只能针对小量数据,对数据操作比较笨拙,如果想改动数据的某一小部分,需要解压或归档整个数据。
(2)NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺点:如果要存储其他类型,需要转换为前面的类型,才能用NSUserDefaults存储。
(3)Write写入方式:永久保存在磁盘中。第一步:获得文件即将保存的路径:第二步:生成在该路径下的文件:第三步:往文件中写入数据:最后:从文件中读出数据:
(4)SQLite:采用SQLite数据库来存储数据。SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些。
(5)CoreData:系统自带的数据库存储。
2、深拷贝和浅拷贝的理解?
对实例进行深拷贝时当前类需要实现NSCopying协议。
浅拷贝是复制出来一个跟原对象相同地址的对象
深拷贝时复制一个跟源对象不同地址的对象 改变源对象对新对象没有影响
3、什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储?
序列化是把对象转化成字节序列的过程 反序列化是把字节序列恢复成对象
将对象写到文件或者数据库里,并且能读取出来
遵循NSCoding协议 实现复杂对象的存储 实现该协议后可以对其进行打包或解包,转化成NSData
4、谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
好处:
(1)使用线程可以把占据时间长的程序中的任务放到后台去处理
(2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
(3)程序的运行速度可能加快
(4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。
缺点:
(1)如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
(2)更多的线程需要更多的内存空间。
(3)线程的中止需要考虑其对程序运行的影响。
(4)通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
实现多线程的方法:
NSObject类方法
NSThread
NSOperation
GCD