【问题标题】:ARC weak and strong references with outlets and collection of outlets?ARC 对网点和网点集合的弱引用和强引用?
【发布时间】:2013-11-02 12:17:58
【问题描述】:

我想了解更多关于 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,我还添加了一个弱引用,因为当我将这个子视图添加到超级视图中时,会有一个强引用。第一个问题:这是一个好方法吗?

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

如果我想保留一系列以编程方式添加的视图,我不能,因为NSArray 也保留了强引用和视图的超级视图,所以会有一些泄漏。我怎样才能拥有我的子视图的NSArray 而不会泄漏?

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

-(BOOL) viewDidLoad
{
    ?
}

【问题讨论】:

  • 您应该查看什么是 ARC 循环引用以帮助您理解这一点。只要不创建循环引用(也称为“保留循环”),您就可以拥有任意数量的强引用。因此,您的属性可以是 strong 而不是 weak;实际上,如果您可能要从一个地方删除子视图并稍后将其添加到另一个超级视图,这很常见。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    2) IBOutletCollection 实际上已被预处理器删除,对编译器没有任何意义。这只是 XCode 中的一个提示,即有一个与该属性关联的出口集合。

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

    NSArray of weak references (__unsafe_unretained) to objects under ARC

    【讨论】:

      【解决方案3】:

      Outlets 通常是弱引用,因为视图归其父视图所有。如果你让它们成为弱引用,你要摆脱一个视图对象所要做的就是将它从它的超级视图中删除,然后出口被清零。

      您以编程方式创建的子视图示例是相同的,将其弱化是个好主意。

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

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

      您可能可以使用 NSPointerArray 创建自己的出口集合等价物,它不会保留您传递给它的指针。但是,您需要小心,因为它也不会将释放的项目归零,因此如果您从视图中删除项目但没有删除它们在 NSPointerArray 中的条目,您会得到僵尸。

      考虑到所有因素,我建议只使用常规的可变数组并对内容进行自己的整理,以从数组中删除项目(如果您将它们从超级视图中删除)。

      【讨论】:

      • 所以我必须从我的 NSArray 中清除对象,但我必须在哪里执行此操作,didReceiveMemoryWarning 和 viewDidDisappear ?
      猜你喜欢
      • 2013-10-12
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      相关资源
      最近更新 更多