我正在尝试创建一个方法来释放我还没有因任何原因发布的对象。我在我的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] ;
}
}
}
不幸的是,应用程序崩溃了。我做错了什么?
答案 0 :(得分:4)
我做错了什么?
您没有平衡您的保留和发布。你不应该在你的例子中需要这样的代码。如果您保留了某些内容,请在完成后将其释放。还有其他事情在乞求麻烦。
具体来说,在此代码中,您将释放所有观看次要视图。您的代码是否保留了这些视图中的每一个?如果不是,你就不应该释放它们。如果是,为什么?你是否对每一个都保持单独的引用?您的视图将保留您添加为子视图的所有视图;如果你有其他的引用,你只需要保留它们(有些人选择不保留它们。)
答案 1 :(得分:1)
您释放可能已经发布的对象,并且仅将其保留为子视图的视图保留。由于您的版本未从其超级视图中删除视图,因此最终会在视图层次结构中显示死对象。当视图被解除分配时,或者当它重绘所有子视图时,这将崩溃。
答案 2 :(得分:1)
对于大多数情况下,您首先必须从超视图中删除视图,否则您将释放超级视图仍需要或保持引用的对象。
你不应该这样做,你应该在保留和释放之间取得平衡。
作为额外的,我真的不知道:使用malloc_size
是否正确?