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

Lor*_*o B 3 memory-management weak-references objective-c automatic-ref-counting

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

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

当我使用这段代码时:

id _weak myWeakObj = [[NSObject alloc] init];
Run Code Online (Sandbox Code Playgroud)

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

id _strong myStrongObj =  [[NSObject alloc] init];
id _weak myWeakObj = myStrongObj;
Run Code Online (Sandbox Code Playgroud)

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

mat*_*way 5

以下是你的朋友:

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

特别要看一下:

如果你看一下objc_initWeak,并objc_destroyWeak按照有关1号联系洽谈,然后你会看到它是如何工作的"引擎盖下".胆量weak_register_no_lock用于注册弱引用,weak_unregister_no_lock用于取消注册弱引用.

我会把它留给你去看看它实际上如何工作的所有复杂性:-).

  • 这意味着当且仅当对象尚未被释放或正在被解除分配时,它将保留对象并返回该对象.即它总会给你一个有效的对象,或者为零. (3认同)
  • 自动释放池与`__weak`无关.游戏中可能还有一个自动释放池,是的.事实上当你加载一个弱引用(参见`objc_loadWeak`)时,它会保留并自动释放该对象.但是你不需要担心这里的自动释放池 - 它与`__weak`变量的工作原理无关. (2认同)