【发布时间】:2011-12-03 07:53:19
【问题描述】:
我正在使用removeFromSuperview 从其父视图中删除视图。我还在该对象上使用了removeFromSuperview 之后的release,有时它工作正常,但有时访问不正确。
是removeFromSuperview 也调用release 到对象?
【问题讨论】:
标签: iphone objective-c memory-management
我正在使用removeFromSuperview 从其父视图中删除视图。我还在该对象上使用了removeFromSuperview 之后的release,有时它工作正常,但有时访问不正确。
是removeFromSuperview 也调用release 到对象?
【问题讨论】:
标签: iphone objective-c memory-management
是的,removeFromSuperview 也会发布视图。
您需要在将视图添加到其父视图后释放它。
CGRect frame; // let's assume you already have defined frame and superview
UIView *superview;
UIView *subview = [[UIView alloc] initWithFrame:frame];
[superview addSubview:subview];
[subview release];
或者在创建视图时只使用autorelease。
UIView *subview = [[[UIView alloc] initWithFrame:frame] autorelease];
[superview addSubview:subview];
在这两种情况下,您都不需要在调用removeFromSuperview 之后再调用release。
【讨论】:
是的,addSubview 调用保持,removeFromSuperview 调用释放。所以你对 release 的调用不属于那里(它可能在你分配子视图之后属于,假设你不想持有该对象)。
【讨论】:
正确答案是“可能”。这是您甚至不应该真正考虑的实现细节。如果您的代码需要与子视图一起使用,那么您应该在开始处理它之前保留它,并且您应该在完成使用它时释放它(这可能与从它的超级视图中删除它一致,也可能不一致)。
我想测试会显示 removeFromSuperview 确实释放了视图,但你不能依赖这种行为,也不应该假设它会发生。即使它现在总是发生,将来也可能不会发生。
您甚至不需要考虑这样低级别的内存管理。如果您使用retain 或copy 或alloc 或new 保留该对象,那么您有责任在将来的某个时候使用release 来抵消它。
如果你没有做任何这些事情,那么你不应该发布它。将子视图添加到视图的方法的名称中不包含 retain 或 copy,因此当您将其从超级视图中删除时,您不应该自己释放它。
视图系统非常复杂,尤其是在 RAM 如此有限且存储空间不足以使用虚拟内存的 iPhone 上。遵守规则,你应该没问题。或者启用 ARC。
【讨论】:
实际上removeFromSuperview减少了视图对象的retainCount属性,所以release。
所以,如果你按照 Aleksejs 所说的那样去做。
UIView *subview = [[UIView alloc] initWithFrame:frame];
[superview addSubview:subview];
[subview release];
subview -> alloc= retainCount = +1 ,
subview -> addSubView = retainCount = +1
subview -> release = retainCount = -1。
subview -> removeFromSuperView = retainCount = -1
(从内存中删除子视图)
【讨论】: