在Objective-C上尚未发布释放对象

时间:2012-02-13 15:42:26

标签: iphone release dealloc

我正在尝试创建一个方法来释放我还没有因任何原因发布的对象。我在我的ViewController的dealloc方法中添加了这个:

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] ;
        }
    }
}

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

3 个答案:

答案 0 :(得分:4)

  

我做错了什么?

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

具体来说,在此代码中,您将释放所有观看次要视图。您的代码是否保留了这些视图中的每一个?如果不是,你就不应该释放它们。如果是,为什么?你是否对每一个都保持单独的引用?您的视图将保留您添加为子视图的所有视图;如果你有其他的引用,你只需要保留它们(有些人选择不保留它们。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

你不应该这样做,你应该在保留和释放之间取得平衡。

作为额外的,我真的不知道:使用malloc_size是否正确?