weak原理
weak在底层维护了⼀张weak_table_t结构的hash表,key是所指对象的地址,value是weak指针的
地址数组。weak所引⽤对象的引⽤计数不会加1,对象释放时,会根据对象地址获取所有weak指针
地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除。
添加弱引⽤流程总结:
- 如果被弱引⽤的对象为nil 或这是⼀个TaggedPointer,直接返回,不做任何操作。
- 如果被弱引⽤对象正在析构,则抛出异常。
- 如果被弱引⽤对象不能被weak引⽤,直接返回nil。
- 如果对象没有再析构且可以被weak引⽤,则调⽤weak_entry_for_referent ⽅法根据弱引⽤对象的地址从弱引⽤表中找到对应的weak_entry,如果能够找到则调⽤append_referrer ⽅法向其中插⼊weak指针地址。否则新建⼀个weak_entry。
移除弱引⽤流程总结:
- ⾸先在weak_table中找出被弱引⽤对象对应的weak_entry_t。
- 在weak_entry_t中移除weak指针地址。
- 移除元素后,判断此时weak_entry_t中是否还有元素,如果此时weak_entry_t已经没有元素了,则需要将weak_entry_t从weak_table中移除。
⾃动释放池
AutoreleasePool(⾃动释放池)是OC中的⼀种内存⾃动回收机制,它可以延迟加⼊
AutoreleasePool中的变量release的时机。在正常情况下,创建的变量会在超出其作⽤域的时候
release,但是如果将变量加⼊AutoreleasePool,那么release将延迟执⾏。