繁体   English   中英

ARC关于网点和网点集合的弱引用和强引用?

[英]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存储弱引用的页面:

对ARC下的对象的弱引用(__unsafe_unretained)的NSArray

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM