[英]Creating IBOutlets as ivars on ARC. Memory issues?
我知道,Objective-C开发的最佳实践表明IBOutlets应该始终被Apple定义为属性。
从实际的角度来看,在iOS和OS X中,出口应定义为已声明的属性。 出口通常应该较弱,但从文件所有者到笔尖文件(或iOS中的情节提要场景)中顶级对象的出口则应较坚固。
但是出于学习目的,我们使用ARC获得了以下方案:
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController{
IBOutlet UIButton *buttonA;
IBOutlet UIButton *buttonB;
IBOutlet UIButton *buttonC;
}
@end
如果我没记错的话,那三个按钮很坚固,所以我的问题是:一旦释放ViewController,这些按钮是否会从内存中释放出来?
我知道,如果这些按钮较弱,它们会自动释放,但不确定它们是否较强。
谁能帮忙吗? 请注意,DetailViewController上的方法'dealloc'为空。
您询问:
如果我没记错的话,那三个按钮很
strong
,所以我的问题是:释放ViewController后,这些按钮会从内存中释放吗?
是。 或者,更准确地说,当没有更强的引用时,这些按钮将被释放。 在这种情况下,这些按钮现在具有两个strong
引用,一个是视图控制器,另一个是将这些按钮添加为子视图的视图。 在释放按钮之前,都需要释放这两个strong
引用。
但是,为什么要保持对该控件的两个强烈引用呢? 通常,让视图维护对其子视图的strong
引用(即,让视图“拥有”其子视图),并且视图控制器仅对这些子视图使用weak
引用。
我知道,如果这些按钮
weak
,它们会自动释放,但是不确定它们是否strong
。
当视图控制器具有weak
引用时,按钮将被释放,因为对该按钮的唯一strong
引用是由其父视图维护的,并且当删除该视图时,该按钮将失去其最后的强引用并可以被释放。
如果视图控制器具有strong
引用,则不必要地添加了另一个strong
引用,在释放按钮之前需要释放该strong
引用。 您可以这样做,但这不是必需的。 您引用了《 资源编程指南》中的内容 ,但前面的句子说:“您不需要对图下方的对象的强引用,因为它们是其父级拥有的,因此应将创建强引用周期的风险降到最低。”
最重要的是,您的示例具有对IBOutlet
控件的隐式strong
引用。 但是,让视图控制器保持对按钮的strong
引用没有任何好处,这表示对对象图有些误解。 实际上,视图控制器只应在其视图上维护对控件的weak
引用。
是的,当释放ViewController时,甚至会释放其强烈引用的对象。 (当然,除非其他一些未发布的对象对此有很强的引用。)
这里对弱和强进行了很好的讨论: iOS5中强和弱存储的说明
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.