iOS main()执行前的过程 + weak 置 nil的过程

2018-05-30  本文已影响17人  reboot_q

main()

ps: 第一次启动 app 耗时较长, 就是由于要将 MachO 加载到缓存中, 等到第二次启动 app 时, 直接从缓存中读取数据!

weak

runtime 会对注册的类进行布局, 对象被 weak 修饰以后, 将调用 objc_initWeak 初始化一个新的 weak 指针指向对象地址, 然后调用 objc_storeWeak() 更新新的指针的指向, 创建弱引用 hash 表(将对象地址作为 key, 将 weak 指针地址作为 value), 最后等到引用计数为0时, 调用 clearDeallocating 将hash 表中 key 所对应的 valueArray 全部置 nil, 然后清除此条记录.

runloop

runloop 是一个让线程能随时处理事件但不退出的机制. runloop 实际是一个对象, 这个对象管理了其需要处理的事件和消息, 并提供了一个入口函数来执行 Event Loop 逻辑. 线程执行了这个函数后, 就会一直处于这个函数内部 "接受消息"->"等待"->"处理"的循环中, 直到这个循环结束(quit).
iOS/OSX 系统中, 提供了两个 runloop 对象, NSRunloop 和 CFRunloopRef. 线程和 runloop 之间是一一对应的, 其关系是保存在一个全局的字典中. 线程创建时并没有开启 runloop, 如果不主动获取, 那它一直不会开启. runloop 的创建是发生在第一次获取时, runloop 的销毁是发生在线程结束时. 只能现在线程内部, 获取当前线程的 runloop(主线程除外).

上一篇 下一篇

猜你喜欢

热点阅读