1、AFN2.x为什么添加一条常驻线程?
AFN2.0里面把每一个网络请求的发起和解析都放在了一个线程里执行。正常来说,一个线程执行完任务后就退出了。开启runloop是为了防止线程退出。一方面避免每次请求都要创建新的线程;另一方面,因为connection的请求是异步的,如果不开启runloop,线程执行完代码后不会等待网络请求完的回调就退出了,这会导致网络回调的代理方法不执行。
- 这是一个单例,用NSThread创建了一个线程,并且为这个线程添加了一个runloop,并且加了一个NSMachPort,来防止runloop直接退出。
- 这条线程就是AF用来发起网络请求,并且接受网络请求回调的线程,仅仅就这一条线程
2、AFN3.x为什么不再需要常驻线程?
NSURLConnection的一大痛点就是:发起请求后,这条线程并不能随风而去,而需要一直处于等待回调的状态。
苹果也是明白了这一痛点,从iOS9.0开始 deprecated 了NSURLConnection。 替代方案就是NSURLSession。
self.operationQueue = [[NSOperationQueue alloc] init];
self.operationQueue.maxConcurrentOperationCount = 1;
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
为什么说NSURLSession解决了NSURLConnection的痛点,从上面的代码可以看出,NSURLSession发起的请求,不再需要在当前线程进行代理方法的回调!可以指定回调的delegateQueue,这样我们就不用为了等待代理回调方法而苦苦保活线程了。
同时还要注意一下,指定的用于接收回调的Queue的maxConcurrentOperationCount设为了1,这里目的是想要让并发的请求串行的进行回调。
参考:https://www.jianshu.com/p/b5c27669e2c1
3、为什么AF3.0中需要设置self.operationQueue.maxConcurrentOperationCount = 1;
而AF2.0却不需要?
功能不一样:AF3.0的operationQueue是用来接收NSURLSessionDelegate回调的,鉴于一些多线程数据访问的安全性考虑,设置了maxConcurrentOperationCount = 1来达到串行回调的效果。
而AF2.0的operationQueue是用来添加operation并进行并发请求的,所以不要设置为1。
4、KVC原理
设值
当调用setValue:属性值 forKey:@”name“的代码时,底层的执行机制如下:
- 程序优先调用set
- 如果没有找到setName:方法,KVC机制会检查+ (BOOL)accessInstanceVariablesDirectly方法有没有返回YES,默认该方法会返回YES,如果你重写了该方法让其返回NO的话,那么在这一步KVC会执行setValue:forUndefinedKey:方法,不过一般开发者不会这么做。所以KVC机制会搜索该类里面有没有名为_
- 如果该类即没有set
- 和上面一样,如果该类即没有set
如果上面列出的方法或者成员变量都不存在,系统将会执行该对象的setValue:forUndefinedKey:方法,默认是抛出异常。
取值
当调用valueForKey:@”name“的代码时,KVC对key的搜索方式不同于setValue:属性值 forKey:@”name“,其搜索方式如下:- 首先按get
- 如果上面的getter没有找到,KVC则会查找countOf
- 如果上面的方法没有找到,那么会同时查找countOf
- 如果还没有找到,再检查类方法+ (BOOL)accessInstanceVariablesDirectly,如果返回YES(默认行为),那么和先前的设值一样,会按_
还没有找到的话,调用valueForUndefinedKey:
5、苹果是如何实现Autorelease Pool的?
autoreleasepool 以一个队列数组的形式实现,主要通过下列三个函数完成.
- objc_autoreleasepoolPush
- objc_autoreleasepoolPop
- objc_autorelease
看函数名就可以知道,对 autorelease 分别执行 push,和 pop 操作。销毁对象时执行release操作。
6、数据结构与算法
例如:
- 字符串
- 链表
- 排序
- 栈和队列
- 堆
- 二叉树
- 哈希表
- 图
iOS面试中的算法和数据结构:
参考地址1:https://github.com/wupengFEX/iOSInterView
参考地址2:https://www.yangshebing.com/2016/04/24/iosmian-shi-ti-xi-lie-zhi-chang-jian-suan-fa/
参考地址3:https://hit-alibaba.github.io/interview/basic/algo/Sorting.html
答案都是收集而来,如果有什么错误,欢迎指正!