【问题标题】:iOS Objective-C Memory sufficient removal of elements (ARCs impact on child elements)iOS Objective-C Memory 足够移除元素(ARCs 对子元素的影响)
【发布时间】:2015-10-17 00:50:35
【问题描述】:

当使用removeFromSuperview 删除UIView 时,ARC 是否会正确处理UIView 的子元素的dealloc

例如:

UIView *myView = [[UIView alloc] init];
[self.view addSubview:myView];

UILabel *myLabel = [[UILabel alloc] init];
[myLabel setText:@"Hey"];
[myView addSubview:myLabel];

如果didReceiveMemoryWarning:

[myView removeFromSuperview];

[myView removeFromSuperview]; 是否足以删除 myView 的子元素 (myLabel),还是应该删除子元素?

作为一个附带问题:除了从超级视图中删除之外,myView 是否应该设置为 nil,或者 ARC 会处理它吗?

【问题讨论】:

  • 如果myView 是您在此处显示的局部变量,那么您不需要将其设置为 nil - 一旦超出范围,它的引用就会被删除。如果它是 strong 属性或 iVar,则需要将其显式设置为 nil。通常 weak 引用与持有唯一 strong 引用的父视图一起使用

标签: ios objective-c uiview memory-leaks automatic-ref-counting


【解决方案1】:

是的。对象的强属性在对象被释放时被释放。这对于视图的subviews 数组是正确的。由于数组的元素在数组被释放的同时也被释放,这些子视图也将被释放。完成所有这些的代码由 ARC 插入。

请记住,释放只会减少对象的引用计数。对象在其引用计数达到零之前不会被释放。这意味着如果有其他强指针指向其他地方保留的子视图,则子视图将保留。

所以...

[someView removeFromSuperview];  // will free someView's subviews

但是……

[someView addSubview:someSubview];
someObject.strongProperty = someSubview;

[someView removeFromSuperview];  // will free someView's subviews
// but not someSubview, which is now retained elsewhere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2021-11-26
    • 1970-01-01
    • 2021-06-19
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多