我觉得这个问题的文档不够清晰:
假设你正在使用 iOS(不是 Mac 的情况,无需提及差异)。 假设它严格为 4.0+(不需要提及旧操作系统中的差异)。 假设我们严格自动加载 NIB。
假设您有一个 UIViewController,名为 BigView。 假设在 NIB 文件中有十几个所谓的“顶级”项……可以是自定义控件、图像或其他任何内容。
假设您肯定会显式创建然后在应用程序运行期间多次摆脱 BigView。 所以:
对于 NIB 中的其中一个顶级项,有三种可能性:
(1) 您根本没有它的任何 IBOutlet。
(2) 您已连接 IBOutlet - 但不是属性。
(3) 您已连接 IBOutlet 属性(为避免混淆,我们将说是保留属性)。
那么当释放 BigView 时该项会发生什么?
在情况(3)下,显然您必须明确释放。 如果不这样做,它将在视图消失后继续存在。 没问题。
在情况(1)下,我认为(但有人能够实际确认吗?)该项将在 BigView 消失时释放。
在情况(2)下,不清楚会发生什么……...
查看众所周知的参考链接:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html 非常可疑:
"在 iOS 中,nib-loading 代码使用 setValue:forKey: 方法重新连接每个 outlet。当该方法找不到适当的访问器方法时,它会尝试其他方法。如果失败了 [那么会发生什么?告诉我们吧,苹果...] ..."
并向下滚动至“Nib Object Retention”:
"nib 文件中的对象的保留计数为 1,然后被自动释放 "。太棒了。
但是等等!再往下看几个单词...
然而,...如果有可用的 setter 方法,则使用它,或者如果没有可用的 setter 方法,则默认保留对象
他们在说什么?
他们是否意味着如果没有 setter 方法(ivar,但没有属性),它会再次被保留(除了在之前提到的“retain”之外)——还是他们只是重复自己,即“默认保留对象”的“retain”与他们刚刚立即谈论的“创建保留计数为 1 然后被自动释放”的“retain”相同。
如果这不是发生的事情,他们为什么要提及 autorelease?
确实,如果有人确切地知道这个问题的答案......你是怎么知道的? 通过问 DTS,还是通过测试,或者其他方法?我建议,关键的文档(刚刚粘贴)非常不清楚。
同样-如果您有一个 IBOutlet,但没有属性,连接到一个“顶级”对象...您负责释放它吗?它是否被保留?
换句话说...仅在情况(1)中,当 BigView 消失时,是否绝对会释放该物品呢?我当然认为是这种情况,但是谁知道呢?
问题是如果您使用 IBOutlet iVar,但没有属性...会发生什么...
我以前很愚蠢地从未考虑过这个/过于假设,有人有决定性的答案吗? 感谢!!
为记录,我已经制作了一个测试项目。
事实上(令我惊讶的是)将IB元素连接到IBOutlet中实际上似乎会添加一个保留。
(我只能从糟糕的文档中推断,在那种情况下,您具体得到:Retain,Autorelease,Retain-导致平衡时保留一个。)
所以,这就是答案。
我将发布演示项目。 我还引导任何读者查看Jonah在下面的答案,对setValue:forKey:的行为进行无缝解释。 感谢