![](/img/trans.png)
[英]Why some Outlets are made strong references even tough the documentation specifies that outlets should be weak reference
[英]ARC weak and strong references with outlets and collection of outlets?
我将获得有关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;
}
对按钮有较弱的引用是正常的,因为其超级视图对此按钮具有较强的引用。
现在,我以编程方式添加UIView
,我也放置了一个弱引用,因为当我将这个subView添加到超级视图中时,将会有一个强引用。 第一个问题:这是一个好方法吗?
现在,我的真正问题出在该集合的第二个源代码上。 我可以在IBOutletCollection
放什么?
而且,如果我想保留以编程方式添加的一系列视图,则不能这样做,因为NSArray
保留了强大的引用和视图的超级视图,因此会出现一些泄漏。 我如何在不泄漏的情况下拥有子视图的NSArray
?
@property (?) IBOutletCollection .....
@property (?) NSArray *subviews
-(BOOL) viewDidLoad
{
?
}
出口通常是弱引用,因为视图由其超级视图拥有。 如果使它们成为弱引用,则要摆脱视图对象,您所需要做的就是将其从其父视图中删除,并且出口将被清零。
以编程方式创建的子视图示例是同一回事,而使其变弱则是个好主意。
您的NSArray子视图需要成为强引用,否则将发布该数组。 IBOutletCollection也是如此,它实际上只是系统维护的数组。
如果要在释放拥有的视图控制器之前释放它们,则需要自己从这些数组中删除视图。
您可能可以使用NSPointerArray创建自己的奥特莱斯集合等效项,它不会保留传递给它的指针。 但是,您将需要小心,因为它也不会将释放的项目归零,因此,如果您从视图中删除了项目但未删除其在NSPointerArray中的条目,则您将得到僵尸。
考虑所有事情,我建议只使用一个常规的可变数组,并对内容进行自己的整理,以将其从数组的超级视图中删除。
对于第一个问题,是的,这是推荐的子视图属性策略。 关于第二个问题,我不确定您要问什么。 如果您正在寻找IBOutletCollection,那么这是一个很好的教程 。 如果不是,请说明IBOutletCollection存在的问题。
1)以编程方式添加子视图时,可以将弱引用作为属性保留在视图控制器中。
2)IBOutletCollection实际上是由预处理器删除的,对编译器没有任何意义。 这只是XCode中的提示,即与该属性相关联的插座集合。
3)这是讨论使用NSArray存储弱引用的页面:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.