引擎盖下的__weak合格变量发生了什么?

时间:2012-05-22 21:08:08

标签: objective-c memory-management automatic-ref-counting weak-references

通常使用weak引用来避免应用程序对象图中的保留周期。我明白那一部分。现在我想更进一步,了解它们是如何工作的。

搜索了一下,我读过当我使用__weak限定符时,与该限定符关联的变量在自动释放池中注册,但这是什么意思?为什么对象在池中注册?使用什么类型的游泳池?它是主池还是其他一些专门创建的池?

当我使用此代码时:

id _weak myWeakObj = [[NSObject alloc] init];

编译器给了我一个警告,我可以修复:

id _strong myStrongObj =  [[NSObject alloc] init];
id _weak myWeakObj = myStrongObj;

那么,基于上一个问题,myStrongObj引用的对象会发生什么?如果可能的话,我想知道编译器的代码是什么样的?

1 个答案:

答案 0 :(得分:5)

以下是你的朋友:

还有Objective-C运行时的源代码:

特别要看一下:

如果按照第一个链接的说法查看objc_initWeakobjc_destroyWeak,那么你会看到它是如何工作的“引擎盖下”。胆量在weak_register_no_lock用于注册弱引用,而在weak_unregister_no_lock用于取消注册弱引用。

我会让你通过并查看有关实际的工作方式的所有错综复杂信息: - )。