1

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

从实际的角度来看,在 iOS 和 OS X 中的 outlet 应该被定义为声明的属性。出口通常应该是弱的,除了从文件所有者到 nib 文件中的顶级对象(或者,在 iOS 中,故事板场景)应该是强的。

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

#import <UIKit/UIKit.h>

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

@end

如果我没记错的话,这三个按钮很强大,所以我的问题是:一旦释放 ViewController,这些按钮会从内存中释放吗?

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

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

4

2 回答 2

4

您问:

如果我没记错的话,那三个按钮是strong,所以我的问题是:一旦 ViewController 被释放,这些按钮会从内存中释放吗?

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

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

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

当视图控制器具有weak引用时,按钮将被释放,因为对该strong按钮的唯一引用由其父视图维护,并且当该视图被删除时,该按钮将失去其最后的强引用并且可以被释放。

如果视图控制器有一个strong引用,则在释放按钮之前不必要地添加另一个strong需要释放的引用。你可以这样做,但这是不必要的。您引用了Resource Programming Guide,但前面的句子说“您不需要对图中较低的对象进行强引用,因为它们归其父级所有,您应该尽量减少创建强引用循环的风险。”

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

于 2013-12-07T15:01:09.753 回答
2

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

这里有一个关于弱和强的很好的讨论:iOS5 中强弱存储的解释

于 2013-12-07T15:00:34.333 回答