是removeFromSuperview发布对象吗?

时间:2011-12-03 07:53:19

标签: iphone objective-c memory-management

我正在使用removeFromSuperview从其超级视图中删除视图。我也在release之后对该对象使用removeFromSuperview,有时它的工作正常,但有时会给出错误的访问权限。

removeFromSuperview是否也会向对象调用release

4 个答案:

答案 0 :(得分:1)

是的,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];

在这两种情况下,拨打release后都无需致电removeFromSuperview

答案 1 :(得分:0)

是的,addSubview调用retain,removeFromSuperview调用release。因此,您对release的调用不属于那里(它可能属于您分配子视图后,假设您不想持有该对象)。

答案 2 :(得分:0)

实际上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

(从内存中删除子视图)

答案 3 :(得分:0)

正确答案是“可能”。这是一个您甚至不应该考虑的实现细节。如果您的代码需要使用子视图,那么您应该在开始处理它之前保留它,并且当您使用它时应该将它释放(这可能与从它的超级视图中删除它可能会或可能不一致) )。

我想测试会显示removeFromSuperview会释放视图,但你不能依赖于这种行为,并且永远不要假设它会发生。即使它现在总是发生,也可能在将来发生。

你甚至不需要考虑如此低的内存管理。如果您使用retaincopyallocnew保留对象,那么您有责任在某个位置使用release进行反作用。将来

如果你没有做任何这些事情,那么你就不应该发布它。向视图添加子视图的方法在其名称中不包含retaincopy,因此当您从其超级视图中删除它时,应该自行释放它

视图系统非常复杂,特别是在具有如此有限RAM量且没有足够存储空间来使用虚拟内存的iPhone上。坚持规则,你应该没事。或启用ARC。