我正在使用removeFromSuperview
从其超级视图中删除视图。我也在release
之后对该对象使用removeFromSuperview
,有时它的工作正常,但有时会给出错误的访问权限。
removeFromSuperview
是否也会向对象调用release
?
答案 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会释放视图,但你不能依赖于这种行为,并且永远不要假设它会发生。即使它现在总是发生,也可能在将来发生。
你甚至不需要考虑如此低的内存管理。如果您使用retain
或copy
或alloc
或new
保留对象,那么您有责任在某个位置使用release
进行反作用。将来
如果你没有做任何这些事情,那么你就不应该发布它。向视图添加子视图的方法在其名称中不包含retain
或copy
,因此当您从其超级视图中删除它时,不应该自行释放它
视图系统非常复杂,特别是在具有如此有限RAM量且没有足够存储空间来使用虚拟内存的iPhone上。坚持规则,你应该没事。或启用ARC。