我发现这个问题的文档不清楚:
假设您正在使用iOS(不是Mac案例,不需要提及差异)。说严格是4.0+(不需要提及旧操作系统的差异)。假设我们严格自动加载NIB。
假设你有一个UIViewController,BigView。假设NIB文件中有十几个所谓的“顶级”项目......可以是自定义控件,图像或其他任何东西。
假设您肯定会在应用程序运行期间多次明确创建然后摆脱BigView。所以:
对于NIB中的其中一个顶级项目,有 三种可能性:
(1)根本没有任何形式的IBOutlet。
(2)你有一个连接的IBOutlet - 但不是属性。
(3)你确实有一个连接的IBOutlet属性(为避免混淆,我们会说保留属性)。
那么BigView发布时项目会发生什么?
在(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,但没有属性),那就是它 再次 保留(除了他们刚刚在前一条款中提到的“保留”)---或者,他们只是重复自己,即“默认保留对象”与他们之前所说的“保留”相同(“使用保留计数1创建,然后自动释放“)。
为什么他们甚至会提到自动释放,如果不是这样的话?
确实 - 如果有人真正明确知道这个问题的答案...... 你怎么知道的?!? 你问过DTS,还是通过测试,或者?我建议,关键文档(刚粘贴)是非常不清楚的。
再次 - 如果你有一个IBOutlet, 但不是财产,连接到“顶级”对象.. 你有责任释放它吗?它保留了吗? 在那种情况下?
就此而言....仅仅在情况(1)中,当BigView消失时,它会被释放吗?我当然会认为是这种情况,但谁知道呢?
问题是如果你使用IBOutlet iVar会发生什么,而不是属性......
我愚蠢地从来没有想过这个/假设太多,有没有人有决定性的答案?干杯!!
为了记录,我做了一个测试项目。
事实上(令我惊讶的是) 仅仅将IB元素连接到IBOutlet的行为显然增加了一个保留。
(我只能从伪劣的文件中假设,在那种情况下你特别得到:保留,自动释放,保留 - 导致一个保持平衡。)
所以,这就是答案。
我将发布演示项目。我也引导任何读者阅读下面的Jonah的答案,它完美地解释了setValue的行为:forKey:干杯