【问题标题】:What's going on with __weak qualified variables under the hood?引擎盖下的 __weak 限定变量是怎么回事?
【发布时间】:2012-05-29 10:12:47
【问题描述】:

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

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

当我使用这段代码时:

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

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

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

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

【问题讨论】:

  • 实际的中间(ARC 后)步骤并不能真正用作源代码。您必须查看汇编程序才能看到插入的保留和释放。不过,这是一个很好的问题!
  • 你在哪里读过关于自动释放池和 __weak 的信息?事实并非如此。基本上都是由 Objective-C 运行时处理的。我将尽快制定一个简洁的答案......
  • @JacquesCousteau 感谢您支持和修复标题。如何在汇编程序中查看保留和释放?谢谢。

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


【解决方案1】:

以下是你的朋友:

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

特别是看看:

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

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

【讨论】:

  • 那么,当我使用_weak 时,不涉及自动释放池,是真的吗?或者编译器是否有可能添加一些创建它的神奇指令? 不是这样你指的是我的代码sn-p吗?
  • 自动释放池与__weak 无关。是的,可能仍然有一个自动释放池在起作用。事实上,当您加载弱引用时(请参阅objc_loadWeak),它会保留并自动释放对象。但是您不必担心这里的自动释放池 - 它与 __weak 变量的工作方式无关。
  • 非常感谢您的回复。最后一个问题。在objc_loadWeak 中写到如果对象被注册为__weak 对象,并且存储到对象中的最后一个值尚未被释放或开始释放,则保留该值并返回它。 你能解释如果 object 注册为 __weak 对象,并且存储在 object 中的最后一个值尚未被释放或开始释放,则保留该值并返回它是什么意思。?再次感谢您。
  • 这意味着当且仅当对象尚未被释放或正在被释放时,它将保留对象并返回该对象。即它总是会返回一个有效的对象,或者为零。
  • 感谢您的支持。干杯。
猜你喜欢
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2011-06-29
  • 2018-10-27
  • 2012-12-13
相关资源
最近更新 更多