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修饰。
网友评论