removefromsuperview是否会释放scrollview的对象?

时间:2009-08-27 12:29:32

标签: objective-c iphone xcode memory-management uiscrollview

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

在上面的方法中如果我使用[subview removeFromSuperview];它工作正常...但如果我使用 [subview release];它崩溃了......我想知道如果两者相同或它们之间有什么区别吗?

4 个答案:

答案 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

您将看到没有任何更改,因此您可以再次添加相同的视图而无需分配它!

加上你永远不应该释放一个你从未分配过的对象!!