iOS Objective-C 内存足够删除元素(ARCs 影响 child 元素)
iOS Objective-C Memory sufficient removal of elements (ARCs impact on child elements)
使用 removeFromSuperview
删除 UIView
时,ARC 是否会正确处理 UIView
的 dealloc
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
使用 removeFromSuperview
删除 UIView
时,ARC 是否会正确处理 UIView
的 dealloc
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