ios常见面试题
Posted 晒太阳的仙人掌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios常见面试题相关的知识,希望对你有一定的参考价值。
1.数据存储
1.如果后期需要增加数据库中的字段怎么实现,如果不适用CoreData呢?
- 编写SQL语句来操作原来表中的字段
- 1>增加表字段
- ALTER TABLE 表名 ADD COLUMN 字段名 字段类型
- 2>删除表字段
- ALTER TABLE 表名 DROP COLUMN 字段名
- 3> 修改表字段
- ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名
2.SQLite数据存储是怎么用?
- 1>添加SQLite动态库
- 2>导入主头文件:#import <sqlite3.h>
- 3>利用C语言函数创建\打开数据库,编写SQL语句
3.简单描述下客户端的缓存机制
- 1、缓存可以分为:内存数据缓存、数据库缓存、文件缓存
- 2、每次想获取数据的时候
- 1、先检测内存中有无缓存
- 2、再检测本地有无缓存(数据库\文件)
- 3、最终发送网络请求
- 4、将服务器返回的网络数据进行缓存(内存、数据库、文件),以便下次读取
4.你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的那些需要在线程中创建或者传递?你是用什么样的策略来实现的?
- 1、CoreData是对SQLite数据库的封装
- 2、CoreData中的NSManagedObjectContext(单例)在多线程中不安全
- 3、如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext
- 4、每个NSManagedObject对象实例都可以使用同一个NSPeristentStoreCoordinator前上锁。
2.客户端安全性和框架设计
1、客户端安全性处理方式?
- 1、网络数据传输(敏感数据【账号\密码\消费数据\银行卡账号】不能明文发送)
- 2、协议的问题(自定义协议,游戏代练)
- 3、本地文件存储(游戏的存档)
- 4、源代码
2、sip是什么?
- 1、sip(Session Initiation Protocol),会话发起协议
- 2、sip是简历VOIP链接的IETF标准,IETF是全球互联网最具权威的技术标准化组织
- 3、所谓VOIP,就是网络电话,直接用互联网打电话,不耗费手机话费。
3、有些图片加载的比较慢怎么处理?你是怎么优化程序的性能的?
- 1、图片下载放到异步线程
- 2、图片下载过程中使用占位图片
- 3、如果图片较大,可以考虑多线程断点下载
4、你实现过一个框架或者库以供别人使用么?如果有,请谈谈构建框架或者库时候的经验,如果没有,请设想和设计框架的public的API,并指出大概需要如何做,需要注意一些什么方面来使别人容易地使用你的框架。
- 1、提供给外界的接口功能是否实用、够用
- 2、别人使用我的框架时,能否根据类名、方法名猜出具体功能和作用
- 3、别人调用接口时,提供的参数是否够用、调用起来是否简单
- 4、别人使用我的框架时,要不要再导入依赖的其他框架。
5、APP需要加载超大量的数据,给服务器发送请求,但是服务器卡住了如何解决?
- 1、设置请求超时
- 2、给用户提示请求超时
- 3、根据用户操作再次请求数据
6、地图导航不能用了怎么办?
- 提示用户打开导航定位功能
7、SDWebImage具体如何实现
- 1、利用NSOperationQueue和NSOperation下载图片,还是用GCD的一些函数(解码GIF图片)
- 2、利用URL作为key,NSOperation作为value
- 3、利用URL作为key,UIImage作为value
8、AFN和ASI有什么区别
- 1、AFN基于NSURL,ASI基于底层的CFNetwork框架,因此ASI的性能优于AFN
- 2、AFN采用block的方式处理请求,ASI最初采取代理的方式处理请求,后面也增加了block的方式
- 3、AFN值封装了一些常用功能,满足基本需求,直接忽略了很多扩展功能,比如没有封装同步请求;ASI提供的功能较多,预留了各种接口和工具供开发者自行扩展
- 4、AFN直接解析服务器返回的JSON、XML等数据,而ASI比较原始,返回的是NSData二进制数据
9、runloop定时源和输入源
- 1、你创建的程序不需要显示的创建runloop;每个线程,包括程序的主线程(main thread)都有与之相应的runloop对象,主线程会自行创建并运行runloop
- 2、runloop处理的输入时间有两种不同的来源:输入源(input source)和定时源(timer source)
- 3、输入源传递异步消息,通常来自于其他线程或者程序。定时源则传递同步消息,在特定时间或者一定的时间间隔发生
10、即时通讯中的大量数据处理
- 用put上传到文件服务器,然后发带URL的自定义格式给对方,对方接受到之后下载
11、json解析的具体实现
- 1、SBJson
- 2、JSONKit
- 3、NSJSONSerialization
12、如果在网络数据处理过程中,发现一处比较卡,一般怎么解决?
- 1、检查网络请求操作是否被放在主线程
- 2、异步请求的数量是否过多
- 3、数据量是否太大?如果太大,先清除一些不必要的对象(看不见的数据、图像)
- 4、手机CPU使用率和内存问题
13、怎么解决sqlite锁定的问题
- 1、设置数据库锁定的处理函数
int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*);
- 2、设定锁定时的等待时间
int sqlite3_busy_timeout(sqlite3*,60);
14、KVO内部实现原理
- 1、KVO是基于runtime机制实现的
- 2、当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。派生类在被重写的setter方法实现真正的通知机制(Person -> NSKVONotifying Person)
15、是否可以吧比较耗时的操作放在NSNotificationCenter中?
- 如果在一部线程发的通知,那么可以执行比较耗时的操作
- 如果在主线程发的通知,就不可以执行比较耗时的操作
16、Foundation对象与Core Foundation对象有什么区别?
- 1、Foundation对象是OC的,Core Foundation对象是C对象
- 2、数据类型之间可进行转换
- ARC: bridge retained 、 _bridge transfer
- MRC: _bridge
17、不用中间变量,用两种方法交换A和B的值
A = A + B
B = B - A
A = A - B
或者
A = A^B
B = A^B
A = A^B
3.多线程
1、列举Cocoa中常见对几种多线程的实现,并谈谈多线程安全的几种解决办法及多线程安全怎么控制?
- 1、只在主线程属性访问UI
- 2、如果要防止资源抢夺,得使用synchronized进行加锁保护
- 3、如果异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认就是安全的)
2、GCD内部怎么实现的
- 1、ios和OS X的核心是UNIX内核,GCD是基于UNIX内核实现的
- 2、GTCD的API全部在libdispatch库中
- 3、GCD的底层实现主要有Dispatch Queue 和Dispatch Source
- Dispatch Queue:管理block操作
- Dispatch Source:处理事件 ###3、你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类的地方(提示:可以从两者的实现机制和范围来描述)。
- 1、GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装
- 2、GCD只支持FIFO的队列,NSOperationQueue可以很方便地调整执行顺序、设置最大并发数量
- 3、NSOperataionQueue可以轻松的在Operatrion设置依赖关系,而GCD需要些很多代码才能实现
- 4、NSOperationQueue支持KVO,可以检测opertaion是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)
- 5、CGD的执行速度比NSOperationQueue快
- 任务之间不太互相依赖:CGD
- 任务之间有依赖\或者要监听任务的执行情况:NSOperationQueue
4、既然提到CGD,那么问一下在使用GCD以及block时要注意些什么?他们两是一回事吗?block在ARC中和传统MRC中的行为和用法有什么区别,需要注意些什么?
- block的使用注意
- 1、block的内存管理
- 2、防止循环retain
- MRC:__block
- ARC:__weak__unsafe_unretained
5、在一部线程中下载很多图片,如果失败了,该如何处理?请结合Runloop来谈谈解决方法(提示:在异步线程中启动一个runloop重新发送网络请求,下载图片)
- 1、重新下载图片
- 2、下载王弼,利用runloop的输入源回到主线程属性UIImageView
以上是关于ios常见面试题的主要内容,如果未能解决你的问题,请参考以下文章