for(UIView *subview in [scrollView subviews]) {
NSLog(@"subviews Count=%d",[[scrollView subviews]count]);
//[subview release];
[subview removeFromSuperview];
}
在上面的方法中如果我使用[subview removeFromSuperview];
它工作正常...但如果我使用
[subview release];
它崩溃了......我想知道如果两者相同或它们之间有什么区别吗?
答案 0 :(得分:29)
@MathieuK是正确的,但值得深入研究,因为它是ObjC中一个非常重要的概念。您不应该明确地或隐含地(通过调用Three Magic Words之一)对您没有-release
的对象调用-retain
。您不要调用-release
来释放对象。你调用它来释放你放在对象上的hold 。 scrollview是否保留其子视图不是您的业务(它确实保留其子视图,但它仍然不是您的业务)。 -removeFromSuperview
调用-release
是否也不是您的业务。这是在scrollview及其子视图之间。重要的是,当您关心它们时保留对象并在停止关注它们时释放它们,并让系统的其余部分负责保留和释放它所关心的内容。
答案 1 :(得分:10)
子视图的保留计数可能为1.当您调用[subview release];
时,保留计数变为0并且子视图从内存中释放。后续访问子视图(调用removeFromSuperview
)崩溃,因为子视图不再存在。
在这种情况下,您应该致电[subview removeFromSuperview]
,因为removeFromSuperview
会在子视图上调用release
。
答案 2 :(得分:1)
您需要修改Cocoa Memory Management。
您根本不会发布自己未明确分配或保留的内容。
答案 3 :(得分:-3)
如果你检查了
,它们就不一样了retainCount
之后
removeFromSuperView
您将看到没有任何更改,因此您可以再次添加相同的视图而无需分配它!
加上你永远不应该释放一个你从未分配过的对象!!