通常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_initWeak
和objc_destroyWeak
,那么您会看到它是如何"在引擎盖下"工作的。胆量weak_register_no_lock
用于注册弱引用,weak_unregister_no_lock
用于取消注册弱引用。
我会把它留给你来经历,看看它是如何实际工作的 :-)。