我会了解有关 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
{
?
}
答案 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