【问题标题】:Releasing objects hasn't been released yet on Objective-C释放对象尚未在 Objective-C 上发布
【发布时间】:2012-03-05 00:30:57
【问题描述】:

我正在尝试创建一种方法来释放由于任何原因尚未释放的对象。我在 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] ;
        }
    }
}

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

【问题讨论】:

  • 这看起来像是对某些 UI GC 的狡猾尝试,您尝试解决的问题是什么让您认为需要这样做?
  • 你为什么要发布这些?你留住他们了吗?一般来说,您不需要手动保留/释放子视图:这是由 UIView 基类处理的。
  • 我试图确保我释放了每个对象,但据我在这里看到的,不是以正确的方式。非常感谢!

标签: iphone release dealloc


【解决方案1】:

我做错了什么?

您没有平衡保留和释放。在您的示例中,您永远不需要这样的代码。如果您保留了某些内容,请在完成后将其释放。别的都是自找麻烦。

具体来说,在这段代码中,您将释放视图的所有子视图。您的代码是否保留了这些视图中的每一个?如果不是,你不应该释放它们。如果是,为什么?您是否对每一个单独引用?您的视图将保留您添加为子视图的任何视图;只有在您有其他参考资料时才需要保留它们(有些人即使在那时也选择不保留)。

【讨论】:

    【解决方案2】:

    您释放可能已经释放的对象,并且仅由将其保留为子视图的视图保留。由于您的发布不会从其父视图中删除视图,因此您最终会在视图层次结构中得到一个死对象。这将在视图被释放或重绘其所有子视图时崩溃。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-12-22
        • 2011-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        相关资源
        最近更新 更多