繁体   English   中英

在ARC上将IBOutlets创建为ivars。 内存问题?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM