美文网首页
iOS main()执行前的过程 + weak 置 nil的过程

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

作者: reboot_q | 来源:发表于2018-05-30 14:50 被阅读17次

main()

    1. MachO 初始化;
    1. 读取代码文件(ImageLoader);
    1. dyld 通知 runtime 对 map_images 进行处理;
    1. + load 方法;
    1. dyld 调用 main 函数.

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

weak

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

  • 置 nil 的步骤:
      1. 调用 objc_release();
      1. dealloc();
      1. _objc_rootDealloc();
      1. object_dispose();
      1. objc_destructInstance();
      1. objc_clear_deallocating

runloop

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

相关文章

网友评论

      本文标题:iOS main()执行前的过程 + weak 置 nil的过程

      本文链接:https://www.haomeiwen.com/subject/exotsftx.html