iOS面试题(九)

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

答案都是收集而来,如果有什么错误,欢迎指正!

猜你喜欢

转载自www.cnblogs.com/WinJayQ/p/9170570.html