3

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

搜索了一下,我读到当我使用__weak限定符时,与该限定符关联的变量注册在自动释放池中,但这意味着什么?为什么对象在池中注册?使用什么类型的池?是主池还是其他特别创建的池?

当我使用此代码时:

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

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

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

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

4

1 回答 1

5

以下是你的朋友:

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

特别是,看看:

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

我会留给你去看看它实际上是如何工作的所有错综复杂的:-)。

于 2012-05-22T23:31:50.647 回答