虽然已工作很长时间了,但是看到一些题,我还是会想起那些面试的时光,下面是一些面试的常见题型
1、为什么UIScrollView的滚动会导致NSTimer失效?
应该是因为UIScrollView滚动的时候跟主线程不是同一个runloop mode,一个runloop mode就是input sources、timer和observers的集合。每次执行runloop,都需要指定一个mode。UIScrollView滚动时候由于不同的mode所以也导致它只能保证它所在的runloop的timer有效,而主线程无效。
什么是 Runloop?
是一个与线程相关的机制,可以理解为一个循环,在这个循环里面等待事件然后处理事件.而这个循环是基于线程的,在Cocoa中每个线程都有它的runroop,通过他这样的机制,线程可以在没有事件要处理的时候休息,有事件运行,减轻CPU压力,这题可以衍生出为什么在滑动时会导致定时器失败
定时器里面有个runoop mode,一般定时器是运行在defaultmode上但是如果滑动了这个页面,主线程runloop会转到UITrackingRunLoopMode中,这时候就不能处理定时器了,造成定时器失效,原因就是runroop mode选错了,解决办法有2个,一个是更改mode为NSRunLoopCommonModes(无论runloop运行在哪个mode,都能运行),还有种办法是切换到主线程来更新UI界面的刷新
2、为什么当 Core Animation 完成时,layer 又会恢复到原先的状态?
因为这些产生的动画只是假象,并没有对layer进行改变.那么为什么会这样呢,这里要讲一下图层树里的呈现树.呈现树实际上是模型图层的复制,但是它的属性值表示了当前外观效果,动画的过程实际上只是修改了呈现树,并没有对图层的属性进行改变,所以在动画结束以后图层会恢复到原先状态
3,你会如何存储用户的一些敏感信息,如登录的 token。
使用keychain来存储,也就是钥匙串,使用keychain需要导入
Security
框架
最简单的方法就是导入keychain,相对安全一点,也仅仅是相对安全
7、NSNotification 和 KVO 的使用场景?
KVO使用场景:当一个对象的特定属性改变的时候,需要被通知一个或者多个对象的时候NSNotification使用场景:跨层级传递值,多个对象通知多个对象
8、使用 Block 时需要注意哪些问题?
- 在block内部使用外部指针且会造成循环引用情况下,需要用
__weak
修饰外部指针__weak typeof(self) weakSelf = self;
- 在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下
__strong typeof(self) strongSelf = weakSelf;
- 如果需要在block内部改变外部变量的话,需要在用
__block
修饰外部变量