【问题标题】:Releasing object in viewDidUnload?在 viewDidUnload 中释放对象?
【发布时间】:2011-11-18 11:41:01
【问题描述】:

在我的应用程序中,我调用 presentModelViewController 来呈现一个新控制器。每次触发此操作时都会分配内存。但不知何故,它没有正确发布,因为在某些时候我的应用程序使用了太多内存并且它崩溃了。

这可能是因为我没有正确(或根本没有)释放属性对象是下面提到的正确方法吗? dealloc 可能是,但是 viewDidUnload 呢?

- (void)viewDidUnload {
    [_sushiTypes release];
    _sushiTypes = nil;
}

- (void)dealloc {
    [_sushiTypes release];
    _sushiTypes = nil;
    [super dealloc];
}

【问题讨论】:

    标签: objective-c ios ios4 memory-management


    【解决方案1】:

    不要忘记 viewDidUnload 中对 super 的调用。您还应该通过其设置器访问您的实例变量,以在 viewDidUnload 中将其设置为 nil。在dealloc中,直接释放实例变量即可。

    - (void)viewDidUnload {
    [super viewDidUnload];
    NSLog(@"viewDidUnload being called");
    self.sushiTypes = nil;
    }
    
    - (void)dealloc {
    [_sushiTypes release];
    NSLog(@"dealloc being called");
    [super dealloc];
    }
    

    我不认为这是您的记忆问题的根源。您的模态视图控制器是否有任何其他实例变量或 IBOutlets?

    为了帮助进一步调试,请尝试使用 Instruments。在 Xcode 中,转到 Product > Profile,然后在 Instruments 打开时选择 Allocations 模板。然后多次打开和关闭您的模态视图控制器,并检查您的泄漏和分配。如果每次您出席/解雇时分配都在增长,请尝试在每次出席/解雇之前和之后单击“标记堆”按钮。然后,您可以检查每个循环中正在分配和未释放的对象。

    【讨论】:

      【解决方案2】:

      我想我找到了问题所在。你不应该在 dealloc 函数中分配 nil 值。释放时通常的做法是将 viewDidUnload 与 setter 分配 nil 值,然后在 dealloc 方法中正确释放属性。像这样:

      - (void)viewDidUnload {
          self._sushiTypes = nil;
          [super viewDidUnload];
      }
      
      - (void)dealloc {
          [_sushiTypes release];
          [super dealloc];
      }
      

      记得像 Matty 说的那样在 viewDidUnload 中调用 super。您可以参考这个 SO question 以获得有关此过程的更多信息。 First set to nil and then release.

      【讨论】:

        猜你喜欢
        • 2011-03-14
        • 2011-11-09
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        相关资源
        最近更新 更多