runtime如何实现weak

runtime 对注册的类, 会进行布局,对于 weak 对象会放入一个 hash 表中。 用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候会 dealloc,假如 weak 指向的对象内存地址是a,那么就会以a为键, 在这个 weak 表中搜索,找到所有以a为键的 weak 对象,从而设置为 nil。

运行期系统会将每一个类的weak变量放入相应的一个hash表中,在这个表中以weak变量所指向的对象的内存地址为key,当weak指向的对象引用计数为0执行dealloc方法,对象被销毁,运行期系统通过key去hash表中找到相应的weak对象将他们设置成nil。

关于hash表的补充:

* Objective-C中的字典NSDictionary底层其实是一个哈希表,实际上绝大多数语言中字典都是通过哈希表实现。

* Objective-C的实现和Java比较类似,当我们需要重写isEqual()方法时,还需要重写hash方法。这两种语言并没有提供一个通用的、默认的哈希函数,主要是考虑到isEqual()方法可能会被重写,两个内存数据不同的对象可能在语义上被认为是相同的。如果使用默认的哈希函数就会得到不同的哈希值,这两个对象就会同时被添加到NSSet集合中,这可能违背我们的期望结果。

《招聘一个靠谱的iOS》面试题参考答案

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 要实现weak属性,首先要搞清楚weak属性的特点: weak 此特质表明该属性定义了一种“非拥有关系” (non...
    SessionSinGod阅读 5,092评论 0 2
  • 要实现 weak 属性,首先要搞清楚 weak 属性的特点: weak 此特质表明该属性定义了一种“非拥有关系” ...
    狗狗臭鸡蛋阅读 4,260评论 1 0
  • weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设...
    星捷阅读 1,868评论 0 0
  • runtime对注册的类,会进行布局,对于weak对象会放入一个hash表中,用weak指向的对象内存地址作为ke...
    RFeng阅读 2,880评论 0 1
  • 原来我家孩子不喜欢和别的小朋友玩。就是一个人独自玩,但今天晚上一直在问我:“妈妈,小朋友们,怎么还不来呀?” 孩子...
    我心我愿秀阅读 1,531评论 0 2

友情链接更多精彩内容