UIView将如何发布?说明

时间:2017-05-03 09:59:35

标签: ios objective-c uiview nsarray automatic-ref-counting

在ARC中,我想释放添加到父视图和数组的自定义视图。

@property (nonatomic, weak) IBOutlet UIScrollView* panelScroll;
@property (nonatomic, retain) NSMutableArray *medsSectionViews;

以上是添加了customview对象的两个属性,如下所示:

CustomView* newView;
newView = [[CustomView alloc] init];
[panelScroll addSubview:newView];
[self.medsSectionViews addObject:newView];
newView = nil;

它不释放物体。问题是什么?我怎样才能实现它?请在要求的位置提及参考计数。

3 个答案:

答案 0 :(得分:1)

CustomView *newView = [[CustomView alloc] init]; // 1 owner (the newView local variable)
[panelScroll addSubview:newView];  // 2 owners (local variable, the superview panelScroll)
[self.medsSectionViews addObject:newView]; // 3 owners (local variable, superview, array medsSectionViews)
newView = nil;  // 2 owners (superview, array)

现在

[array removeAllObjects]; // 1 owner (superview)
[newView removeFromSuperview]; // 0 owners
// view gets deallocated because it has no owners

答案 1 :(得分:0)

某些方法会保留对象:

在你的代码中: 1. addSubview: 2. addObject:

保留您的观点;

所以你需要: [array removeAllObjects]; [newView removeFromSuperview];

为什么newView = nil无法释放视图? 因为在ARC中它使用引用计数来管理对象生命周期。

答案 2 :(得分:0)

您的newView变量似乎是一个局部变量。一旦超出范围,它将释放它对您的视图的强烈参考。因此,您实际上不必将其设置为nil。

您还有其他2个强引用:

  1. 阵列保持对其内容的强烈引用。
  2. 当您将视图添加到超级视图时,超级视图会有一个强大的参考。
  3. 如果你想要它被释放,你需要将它从数组中删除并从它的superview中删除它。请注意,它将被取消分配。