说明:题目在前,答案在后。希望大家看到题目的时候先思考一下答案,不要依赖答案,如果觉得答案不够具体,一定要上度娘找到自己满意的答案。代码要经常敲,题目要经常思考。如有错误,敬请雅正。
注意:每天我会推出10道面试题目,贵精不贵多,和大家一起进步。
题目:
1.视图控制器的生命周期?
2.什么是block?
3.UITableView的复用机制?
4.UIView和CALayer之间的关系?
5.什么是同步和异步下载?
6.coreData和FMDB哪个效率高?
7.常见的http请求类型?
8.ios多线程的框架?
9.如何保证线程安全?
10.如果AFNetworking不能使用了,你会使用什么第三方库框架替代它?
以下是答案:
1.视图控制器的生命周期
alloc init(执行一次)
loadView(执行一次)
viewDIdload (执行一次)
viewWillAppearr(可执行多次)
viewDidAppearr(可执行多次)
viewWillDisAppear(可执行多次)
viewDidDsAppear(可执行多次)
viewDidUnload(执行一次)
dealloc(执行一次)
2.什么是block
(1)概念 :在ios中,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值,简单来说就是代码块或者说是代码片段。
(2)应用场景:多用于反向传值
(3)注意事项:
<1>MRC下的block分为三种:
_NSConcretStackBlock 栈block
_NSConcretGlobalBlock 全局block
_NSConcretMallocBlock 堆block
<2>block为什么要用copy修饰符
为了保证block对象不被提前释放,如果对_NSConcretStackBlock使用copy消息,则会把block对象拷贝到堆上,如果_NSConcretGlobalBlock发送copy消息,则什么事都没做,若果对_NSConcretMallocBlock进行copy消息,则引用计数+1。
3.UITableView的复用机制
每一个UITableView都会维护一个复用队列(reuseIdentifyQueue),里面存放着已经被移除出屏幕的UitableViewCell对象,当需要新的cell出现到屏幕上的时候,就需要到对用队列当中寻找同种类型的cell出来复用,这个队列内部可以存放各种不同类型的cell,查找的时候,根据复用标识(reuseIdentify)进行区分。
4.UIView和CALayer之间的关系
UIView是CALayer的一个载体,UIView显示的部分,都是由CALayer来负责的,其实UIView最重要的功能不是用于显示内容,它主要作用是用于管理它所渲染区域的内部的各种事件, UIView是继承自UIResponder,所以它可以响应事件。
5.什么是同步和异步下载
(1) 同步下载(请求):[NSString alloc] initWithContentsOfUrl [NSData alloc] initWithContentsOfUrl,UI界面会卡死(阻塞)。
原因:因为同步下载是单线程操作,实际上是在主线程当中进行下载操作,由于一个线程同时只能执行一个工作,所以就没有空闲去刷新UI了。
(2)异步下载(请求):多线程操作,开启一个子线程去执行下载任务,当下载任务执行完毕之后,再通知主线程刷新UI。
几种回到由子线程回到主线程的方法
(1)、- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
(2)、[[NSOperationQueue mainQueue] addOperationWithBlock:nil];
(3)、dispatch_async(dispatch_get_main_queue(), ^{
})
6.coreData和FMDB哪个效率高
运行效率:coreData高于FMDB
查询效率:FMDB高于coreData
底层使用到的数据库类型;SQLite
特殊情况:coreData只能使用SQLite这个数据库类型来进行持久化储存么?否,XML文件,plist文件等等.
7.常见的http请求类型
get,post,put,delete 查、改、增、删。
IOS9默认需要使用https请求,ATS
https比http更安全
8.ios多线程的框架
(1)NSTheard:线程
(2)NSOperation:线程池,主要是操作队列,主队列(主线程) 子队列(子线程) NSOperation 是对GCD 一个封装 要解决GCD的一些遗留问题
(3)GCD 伟大的调度中心 主要是操作队列 主队列 子队列 GCD一旦开启一个子线程,就无法停止
9.如何保证线程安全
线程锁、 [NSLock lock]
信号量self(标志位),如果信号量已经存在,则该线程锁正在使用当中,其他线程无法进入锁内代码
@synchronized(self){}
static dispatch_once_t one;
dispatch_once(&one, ^{
});
10.如果AFNetworking不能使用了,你会使用什么第三方库框架替代它
(1)MKNetWork. 比较轻量级,简单易用。
(2)ASIHttpRequest,原作者已经停止更新,但是因为在IOS6.0以前,它是最流行的第三方请求框架,一些公司依然自行维护着。