在ARC上创建IBOutlets作为ivars。记忆问题?

时间:2013-12-07 14:15:11

标签: ios objective-c memory properties ivars

我知道Objective-C开发的最佳实践表明IBOutlets应该始终被定义为Apple的属性。

  

从实际角度来看,iOS和OS X应该是   定义为声明的属性。奥特莱斯一般应该很弱,   除了从文件所有者到nib文件中的顶级对象的那些   (或者,在iOS中,一个故事板场景)应该很强大。

但是出于学习目的,我们假设我们使用ARC获得了以下场景:

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController{
     IBOutlet UIButton *buttonA;
     IBOutlet UIButton *buttonB;
     IBOutlet UIButton *buttonC;
}

@end

如果我没弄错的话,这三个按钮很强,所以我的问题是:一旦ViewController发布,这些按钮是否会从内存中释放出来?

如果它们很弱,那些按钮会自动释放,我知道,但不确定它们是否很强。

有人可以帮忙吗?为了清楚起见,DetailViewController上的方法'dealloc'是空的。

2 个答案:

答案 0 :(得分:4)

你问:

  

如果我没弄错的话,那三个按钮是strong,所以我的问题是:一旦ViewController发布,这些按钮是否会从内存中释放出来?

是。或者,更准确地说,当没有更强的引用时,这些按钮将被释放。在这种情况下,这些按钮现在有两个strong引用,一个是视图控制器,另一个是这些按钮作为子视图添加到的视图。在取消分配按钮之前,需要释放这两个strong引用。

但是为什么你要保持对该控件的两个强引用?通常,您让视图维护对其子视图的strong引用(即让视图“拥有”其子视图),并且视图控制器仅使用weak对这些子视图的引用。

  

这些按钮会自动释放weak,我知道,但不确定它们是strong

当视图控制器具有weak引用时,按钮正在被释放,因为该按钮的唯一strong引用由其超级视图维护,并且当该视图被删除时,该按钮将丢失它的最后一个强引用,可以解除分配。

如果视图控制器具有strong引用,则在取消分配按钮之前,您将不必要地添加另一个需要缓解的strong引用。你可以这样做,但这是不必要的。你从Resource Programming Guide引用,但前面的句子说“你不需要强烈引用图中较低的对象,因为它们是由父母拥有的,你应该尽量减少创建强引用周期的风险。“

最重要的是,您对strong控件的隐式IBOutlet引用的示例可以正常工作。但是让视图控制器保持对按钮的strong引用没有任何好处,它代表了对对象图的一点误解。视图控制器实际上应该只保留weak对其视图上的控件的引用。

答案 1 :(得分:2)

是的,当ViewController发布时,即使它的强引用对象也会被释放。 (当然,除非其他一些未发布的对象对它们有强烈的引用。)

这里有一个关于弱者和强者的好讨论:Explanation of strong and weak storage in iOS5