不做长篇大论,不贴代码,只做简单总结,不对的地方感谢指正
Run Loop是什么?为什么存在?
一个run loop就是一个事件处理循环,用来不停的监听和处理输入事件并将其分配到对应的目标上进行处理。
我们需要一个机制,让线程能随时处理事件但并不退出。 在主线程会一直存在一个Runloop,在用户点击应用屏幕是会唤醒,在应用空闲时会进入sleep状态,简单来说,就是通过Run Loop来实现一个圆形线程,
CFRunLoopObserverRef
,这个是用来观测RunLoop的状态变化
AutoreleasePool什么时候释放?
面试经常被问到这个问题,这个问的就是Run Loop这个点
每个runloop中都创建一个Autorelease Pool,在一个runloop进入BeforeWaiting(休眠)的时候AutoreleasePool就会释放
Run Loop的应用?
有一次面试被问到AFNetWorking 中的URLConnection 与Run Loop有什么关系? .........啊?
网络请求需要Run Loop去驱动,URLConnection中单独开启了一个名为“AFNetWorking”的线程,在runloop run 之前会添加一个 NSMachPort端口,为了保证RunLoop 不退出。这样就有了一个网络请求线程去服务整个应用,不会占用主线程资源
TableView的延迟加载优化
在cell里面的图片设置放置在defaultRunLoopMode里面,在滑动的时候图片就不会加载。
scrollerview滑动的时候不影响Timer?
默认scheduledTimer创建Timer的时是在NSRunLoopDefaultMode 里,若不希望timer被ScrollerView影响,需要添加到NSRunLoopCommonModes