ARC自动引用计数
-
ARC 是 LLVM 和 Runtime协作的结果。是编译器在 Runtime 的协作下,在对应的位置自动插入 retain 和 release的 操作。
-
ARC中禁止手动调用 retain、release、retainCount、dealloc等操作。类可以重写dealloc方法,但在方法中不能手动 [super dealloc]; 。
-
ARC中新增 weak、strong 属性关键字。
弱引用管理
__weak 修饰的 弱引用指针weakObj 引用了 alloc 的 obj:
{
id obj = [id alloc] init];
id __weak weakObj = obj;
}
编译后
{
id weakObj;
objc_initWeak(&weakObj, obj);
}
添加 weak 变量
objc_initWeak() ----> storeWeak() ----> weak_register_no_lock()
id
weak_register_no_lock(weak_table_t *weak_table, id referent_id,
id *referrer_id, bool crashIfDeallocating)
里面最终会传入了原对象 和 弱引用变量。函数会先通过原对象指针在弱引用表中通过哈希查找这个对象是否存在弱引用数组,如果这个弱引用数组存在,则在数组中添加这个弱引用变量。如果不存在,则创建这个数组,将弱引用变量添加到数组,并将数组添加到弱引用表中。
清除 weak 变量,weak 变量是如何置为 nil 的
清除 weak 变量时,同事设置为 nil 。
dealloc() -----> ....... -----> weak_clear_no_lock()
weak_unregister_no_lock(weak_table_t *weak_table, id referent_id,
id *referrer_id)
先在弱引用表中哈希查找这个被dealloc的对象是否存在弱引用数组,如果不存在,则不存在弱引用,不作处理。如果存在弱引用数组,则循环将弱引用指针置为 nil。
网友评论