美文网首页
iOS runtime相关

iOS runtime相关

作者: 进击的阿牛哥 | 来源:发表于2019-06-11 13:18 被阅读0次

runtime开始深入weak实现机理

weak修饰符我们一点也不陌生在开发中经常用到,最主要的作用是为了防止引用循环(retained cycle),经常用于block和delegate

weak不论是用作property修饰符还是用来修饰一个变量的声明其作用是一样的,就是不增加新对象的引用计数,被释放时也不会减少新对象的引用计数,同时在新对象被销毁时,weak修饰的属性或变量均会被设置为nil,这样可以防止野指针错误,本文要讲解的也正是这个特性,runtime如何将weak修饰的变量的对象在销毁时自动置为nil。

那么runtime是如何实现在weak修饰的变量的对象在被销毁时自动置为nil的呢?一个普遍的解释是:runtime对注册的类会进行布局,对于weak修饰的对象会放入一个hash表中。用weak指向的对象内存地址作为key,当此对象的引用计数为0的时候会dealloc,假如weak指向的对象内存地址是a,那么就会以a为键在这个weak表中搜索,找到所有以a为键的weak对象,从而设置为nil。

了解了以上知识后就可以深入runtiem代码来看看具体实现细节,有兴趣的读者可以继续阅读。

深入runtime理解weak

这部分内容参考《Objective-C高级编程:iOS与OS X多线程和内存管理》,可以看出具体的实现方式就是使用了一个HashTable。

NSString *name = [[NSString alloc] initWithString: @"Jiaming Chen"];

__weak NSString *weakStr = name;

当为weakStr这一weak类型的对象赋值时,编译器会根据name的地址为key去查找weak哈希表,该表项的值为一个数组,将weakStr对象的地址加入到数组中,当name变量超出变量作用域或引用计数为0时,会执行dealloc函数,在执行该函数时,编译器会以name变量的地址去查找weak哈希表的值,并将数组里所有 weak对象全部赋值为nil。

相关文章

  • IOS面试考察(一):runtime相关问题

    @[TOC] 1. IOS面试考察(一):runtime相关问题 1.1 runtime相关问题 runtime是...

  • iOS运行时Runtime

    相关文档:Runtime-iOS运行时基础篇 相关文档:Runtime-iOS运行时应用篇

  • Runtime学习笔记记录

    文章目录 一 runtime原理 二 Runtime相关的头文件2-1 iOS 中 Runtime相关的头...

  • iOS知识点整理

    iOS知识点整理 持续更新中。。。 runtime相关 iOS 模块详解—「Runtime面试、工作」看我就 ? ...

  • iOS RunTime 详解

    本文讲述 iOS Runtime 相关的知识点,从下面几个方面探寻 iOS Runtime的实现机制。 Runti...

  • iOS runtime--获取类信息

    iOS runtime--获取类信息 在iOS中可以通过runtime获取一个类的相关信息:有哪些方法、有哪些协议...

  • iOS Runtime 相关

    Runtimehttps://www.jianshu.com/p/e09640d87d23 关于 runtime ...

  • iOS - Runtime相关

    一.什么是 runtime ? 二.runtime的头文件 三.消息发送步骤 四.常用方法 五.应用

  • iOS runtime相关

    runtime开始深入weak实现机理 weak修饰符我们一点也不陌生在开发中经常用到,最主要的作用是为了防止引用...

  • 【iOS】Runtime相关

    什么是Runtime(运行时) Runtime是用来将面向对象的Objective-C转换成面向过程的C的一套纯C...

网友评论

      本文标题:iOS runtime相关

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