iOS Objective-C 内存足够删除元素(ARCs 影响 child 元素)

iOS Objective-C Memory sufficient removal of elements (ARCs impact on child elements)

使用 removeFromSuperview 删除 UIView 时,ARC 是否会正确处理 UIViewdealloc child 元素?

例如:

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 的 child 元素 (myLabel),或者是否也应该删除 child 元素?

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

是的。当对象被释放时,对象的强属性也被释放。这对于视图的 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