在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;
它不释放物体。问题是什么?我怎样才能实现它?请在要求的位置提及参考计数。
答案 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个强引用:
如果你想要它被释放,你需要将它从数组中删除并从它的superview中删除它。请注意,它将被取消分配。