2012-02-13 87 views
1

我试图创建释放我还没有发布任何理由却把对象的方法。我想补充这对我的ViewController的dealloc方法:释放对象还没有被释放的Objective-C的

for (id object in [self.view subviews]){ 
    NSLog(@"/n") ; 
    NSLog(@"%@", object) ; 

    if([object isKindOfClass:[UIView class]]){ 
     if (malloc_size(object)>0) { 
      NSLog(@"-> Releasing object with size: %zd", malloc_size(object)) ;  
      [object release] ; 
     } 
    } 
} 

不幸的是,应用程序崩溃。我究竟做错了什么?

+2

对于某些UI GC,这看起来像是一个狡猾的尝试,你试图解决的问题是什么让你认为你需要这样做? – AnthonyBlake 2012-02-13 15:46:08

+0

为什么你想释放这些?你保留了他们吗?一般情况下,你不需要手动保留/释放子视图:这是由UIView的基类来处理。 – smparkes 2012-02-13 15:46:31

+0

我想确保我每天释放的对象,但据我所看到的,不正确的方式。非常感谢! – RGML 2012-02-13 16:05:54

回答

4

我在做什么错?

你没有平衡你的保留和发布。你不应该在你的例子中需要这样的代码。如果您保留某些内容,请在完成后释放它。其他任何事情都在乞求麻烦。

在这段代码中明确,你释放所有视图的子视图。你的代码是否保留了每一个观点?如果不是,你不应该释放它们。如果是的话,为什么?你是否分别引用每一个?您的视图将保留您添加为子视图的任何视图;你只需要保留它们,如果你有其他的参考(和一些人选择不保留即使)。

+0

对我有意义,非常感谢! – RGML 2012-02-13 16:06:12

1

您释放的对象可能已经发布,并且只保留在将其保存为子视图的视图中。由于您的版本不会从其超级视图中删除该视图,因此最终会在视图层次结构中出现死对象。当视图被重新分配或重绘其所有子视图时,这会崩溃。

1

在大多数情况下,您首先必须从超级视图中删除视图,否则您将释放超级视图仍然需要或保持引用的对象。

而且你不应该这样做,你应该保留和释放之间保持良好平衡。

作为一个额外的,这是我真的不知道的东西:是否正确使用malloc_size