引擎盖下的__weak限定变量是怎么回事?



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

稍微搜索一下,我读到当我使用 __weak 限定符时,与该限定符关联的变量在自动发布池中注册,但这是什么意思?为什么在池中注册对象?使用什么类型的池?是主池还是其他专门创建的池?

当我使用此代码时:

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

编译器给了我一个警告,我可以通过以下方式修复:

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

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

以下是您的朋友:

  • http://clang.llvm.org/docs/AutomaticReferenceCounting.html

以及 Objective-C 运行时的来源:

  • http://www.opensource.apple.com/source/objc4/objc4-493.9/runtime/

特别是,看看:

  • http://www.opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-arr.mm
  • http://www.opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-weak.mm

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

我会把它留给你来经历,看看它是如何实际工作的 :-)。

相关内容

  • 没有找到相关文章

最新更新