确实removefromsuperview释放滚动视图的对象?(does removefromsup

2019-07-03 21:31发布

  for(UIView *subview in [scrollView subviews]) {
    NSLog(@"subviews Count=%d",[[scrollView subviews]count]);
    //[subview release];
    [subview removeFromSuperview];
}

在如果我使用上述方法[subview removeFromSuperview]; 它工作正常...但如果我使用[subview release]; 它crashes..i想知道,如果两者都是相同的或者是有它们之间有什么区别?

Answer 1:

@MathieuK是正确的,但它是值得更深的挖掘到这个,因为它是在ObjC一个非常重要的概念。 你不应该调用-release对象上你没有-retain明确或含蓄地(通过调用的一个三点魔的话 )。 你不叫-release ,以解除分配的对象。 你把它释放已经把对象的保持。 无论是滚动视图保留其子视图不是你的业务(但它确实保留其子视图,但它仍然不是你的业务)。 无论-removeFromSuperview调用-release也不是你的业务。 这是betweeen滚动视图和它的子视图。 所有的事情是,你当你关心他们保留的对象并释放他们,当你停止关心他们,并让系统的其余部分采取保持和释放它所关心照顾。



Answer 2:

你的子视图的保留计数可能是1.当你调用[subview release]; 保留计数变为0,子视图从内存中释放。 到子视图(调用的后续访问removeFromSuperview )崩溃,因为子视图不存在了。

在这种情况下,你应该只需要调用[subview removeFromSuperview]因为removeFromSuperview会调用release的子视图本身。



Answer 3:

您需要修改的可可内存管理 。

你根本不释放,你有没有明确分配或保留自己的事情。



Answer 4:

不,他们是不一样的,如果你检查

retainCount

removeFromSuperView

你会看到,没有什么改变,所以你可以不分配它再次添加了同样的观点!

再加上你永远不应该放开你从未分配的对象!



文章来源: does removefromsuperview releases the objects of scrollview?