ARC弱点和强大的参考与网点和网点集合?

时间:2013-10-24 00:47:13

标签: ios objective-c memory-management memory-leaks outlet

我会了解有关 ARC 以及弱强引用的更多信息:

实际上,如果我有:

@interface
@property (weak) IBOutlet UIButton * button
@property (weak) UIView *subview
@end

@implementation

-(BOOL) viewDidLoad
{
    UIView *aSubView= [[UIView alloc]....];
    [self.view addSubview:aSubview];
    self.subview = aSubview;
}

对于按钮的弱引用是正常的,因为它的superview对它有很强的参考。

现在,我以编程方式添加UIView,我也提出了一个弱引用,因为当我在superview中添加这个subView时,会有一个强引用。第一个问题:这是一个好方法吗?

现在我的真正问题在于第二个带有集合的源代码。我可以用IBOutletCollection放些什么?

如果我想保留一系列以编程方式添加的视图,我可以这样做,因为NSArray保留了强大的参考和观看次数' superview也是如此,会有一些泄漏。如何在没有泄漏的情况下获得NSArray个子视图?

@property (?) IBOutletCollection .....
@property (?) NSArray *subviews

-(BOOL) viewDidLoad
{
    ?
}

3 个答案:

答案 0 :(得分:2)

Outlets通常是弱引用,因为视图由其超级视图拥有。如果你把它们作为一个弱引用,那么你要做的就是从它的超视图中删除它,并将插座清零。

您以编程方式创建的子视图的示例是相同的,并且使其变弱是一个好主意。

您的NSArray子视图需要是强引用,否则阵列将被释放。 IBOutletCollection也是如此,它实际上只是系统维护的数组。

如果您希望在拥有的视图控制器被释放之前释放它们,则需要自己从这些阵列中删除您的视图。

您可以使用NSPointerArray创建自己的插座集合等效项,它不会保留您传递给它的指针。但是,您需要小心,因为它也不会将已发布的项目归零,因此如果您从视图中删除了项目但未删除其在NSPointerArray中的条目,您将获得僵尸。

考虑到所有事情,我建议只使用常规的可变数组并对内容进行自己的内务处理,如果从超级视图中删除它们,则从数组中删除项目。

答案 1 :(得分:0)

对于您的第一个问题,是的,这是子视图属性的推荐策略。至于第二个问题,我不确定你在问什么。 Here's a good tutorial on IBOutletCollection如果那就是你要找的东西。如果没有,请澄清您对IBOutletCollection的问题。

答案 2 :(得分:0)

1)以编程方式添加子视图时,可以将弱引用保留为视图控制器中的属性。

2)IBOutletCollection实际上是由预处理器删除的,对编译器没有任何意义。这只是XCode中的暗示,有一个与该物业相关的出口集合。

3)这是一个讨论使用NSArray来存储弱引用的页面:

NSArray of weak references (__unsafe_unretained) to objects under ARC