美文网首页iOS
weak特性总结

weak特性总结

作者: 阿咿呀嘿 | 来源:发表于2017-03-27 19:46 被阅读21次

    1. weak特性是在iOS4之后才开始支持的,即iOS4及以下是不能使用__weak修饰符的。

    2. 若变量使用__weak修饰,则当其所引用的对象被release时,变量会自动被设置为nil。

    原理:
    系统有一个全局的weak对象哈希表,表中每个条目的key为weak变量所指对象的内存地址,value是由所有指向该对象的weak变量的内存地址组成的集合。在对weak变量赋值时,以赋值对象的内存地址为key,将weak变量地址加入到对应集合中,实现weak对象的注册。对象被release时,从weak对象哈希表中查找以对象的内存地址为key的weak变量地址集合,遍历集合将其中所有变量设置为nil,最后从weak表中删除该条目。

    3. 使用weak变量,即是使用注册到autoreleasepool中的对象。

    4. 只在必要的时候使用weak特性,如果滥用会浪费CPU资源。

    5. 使用weak型变量时,最好暂时将weak对象赋值给一个strong变量再使用。因为每次使用weak变量时,都会向autoreleasepool中注册一次对象,频繁注册导致资源浪费。

    6. 不是所有的类的对象都能使用__weak修饰。一、声明时指定了 NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE 的类的对象都不能使用__weak修饰,比如NSMachPort。二、重写了NSObject内部的allowsWeakReference/retainWeakReference实例方法,并返回NO的类的对象不能使用__weak修饰。

    相关文章

      网友评论

        本文标题:weak特性总结

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