【发布时间】:2011-07-28 06:06:27
【问题描述】:
我发现有关此问题的文档不清楚:
假设您正在使用 iOS(不是 Mac 案例,无需提及差异)。说它是严格的 4.0+(无需提及旧操作系统的差异)。假设我们正在严格自动加载 NIB。
假设你有一个 UIViewController,BigView。假设 NIB 文件中有十几个所谓的“顶级”项目......可能是自定义控件、图像或其他任何东西。
假设您肯定会在应用运行期间多次显式创建然后删除 BigView。所以:
对于 NIB 中的这些顶级项目之一,存在三种可能性:
(1) 你根本没有任何类型的 IBOutlet。
(2) 您确实有一个连接的 IBOutlet - 但没有一个属性。
(3) 你确实有一个连接的 IBOutlet 属性(为避免混淆,我们会说一个保留属性)。
那么当 BigView 发布时,item 会发生什么?
在 (3) 的情况下,您必须明确释放似乎很清楚。如果你不这样做,它会在视图消失后徘徊。没问题。
在 (1) 的情况下,我假设(但任何人都可以确认吗?)当 BigView 消失时,该项目将被释放。
在(2)的情况下不清楚会发生什么......
看著名的参考链接:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html很可疑:
“在 iOS 中,nib 加载代码使用 setValue:forKey: 方法重新连接每个插座。该方法类似地寻找合适的访问器方法和 [如果没有一个会发生什么??告诉我们 APPLE。 ..] 失败时求助于其他方式...[GOOD GRIEF!]"
并查看此文档:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html 并向下滚动到“Nib Object Retention”
所以...
“nib 文件中的对象创建时保留计数为 1,然后自动释放” 太棒了..
但是等等!读几句话...
然而,......它使用可用的setter方法或如果没有可用的setter方法则默认保留对象
他们在说什么?
他们是否意味着如果没有可用的 setter(ivar,但没有属性),它是 AGAIN RETAINED (除了他们刚刚在前一个条款中提到的“保留”)---或者,他们只是在重复自己,即“默认保留对象”与他们之前刚刚谈论的“保留”相同(“创建时保留计数为 1,然后自动释放”)。
如果不是这样,他们为什么还要提到自动释放?
确实——如果有人真的特别知道这个问题的答案……你怎么知道?!?你是问DTS,还是通过测试,还是?我建议,关键文档(刚刚粘贴)非常不清楚。
再次 - 如果您有一个 IBOutlet,但不是属性,连接到“顶级”对象.. 您负责释放它吗?它会保留吗? 在那种情况下?
就此而言....仅在情况(1)中,当 BigView 消失时,事物绝对会被释放吗?我当然会假设是这种情况,但谁知道呢?
问题是如果您使用 IBOutlet iVar,而不是属性会发生什么...
我之前愚蠢地从未想过这个/假设太多,有人有决定性的答案吗?干杯!!
为了记录,我做了一个测试项目。
事实上(令我惊讶)将 IB 元素连接到 IBOutlet 的行为显然增加了一个保留。
(我只能从伪劣的文档中假设,在那种情况下,您会得到明确的信息:保留、自动释放、保留 - 导致平衡保留。)
所以,这就是答案。
我将发布演示项目。我还引导任何读者阅读下面 Jonah 的答案,该答案完美地解释了 setValue:forKey: Cheers 的行为
【问题讨论】:
-
非常感谢。我想知道完全相同的问题!读完苹果文档后我很困惑,所以我完全不确定该相信什么。还要感谢 Jonah 的澄清。
-
这很奇怪,呵呵——我同意你的看法。感谢投票,因为那个投票给了我“超能力”或这个网站上的东西!!!我是世界之王!!!
标签: iphone cocoa-touch memory-management interface-builder nib