for(UIView *subview in [scrollView subviews]) {
NSLog(@"subviews Count=%d",[[scrollView subviews]count]);
//[subview release];
[subview removeFromSuperview];
}
在如果我使用上述方法[subview removeFromSuperview];
它工作正常...但如果我使用[subview release];
它crashes..i想知道,如果两者都是相同的或者是有它们之间有什么区别?
@MathieuK是正确的,但它是值得更深的挖掘到这个,因为它是在ObjC一个非常重要的概念。 你不应该调用-release
对象上你没有-retain
明确或含蓄地(通过调用的一个三点魔的话 )。 你不叫-release
,以解除分配的对象。 你把它释放你已经把对象的保持。 无论是滚动视图保留其子视图不是你的业务(但它确实保留其子视图,但它仍然不是你的业务)。 无论-removeFromSuperview
调用-release
也不是你的业务。 这是betweeen滚动视图和它的子视图。 所有的事情是,你当你关心他们保留的对象并释放他们,当你停止关心他们,并让系统的其余部分采取保持和释放它所关心照顾。
你的子视图的保留计数可能是1.当你调用[subview release];
保留计数变为0,子视图从内存中释放。 到子视图(调用的后续访问removeFromSuperview
)崩溃,因为子视图不存在了。
在这种情况下,你应该只需要调用[subview removeFromSuperview]
因为removeFromSuperview
会调用release
的子视图本身。
不,他们是不一样的,如果你检查
retainCount
后
removeFromSuperView
你会看到,没有什么改变,所以你可以不分配它再次添加了同样的观点!
再加上你永远不应该放开你从未分配的对象!