我知道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'是空的。
答案 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