【问题标题】:NSDate memory leakNSDate 内存泄漏
【发布时间】:2013-07-05 16:16:38
【问题描述】:

我已经在其他论坛中搜索了这个问题的答案,但无论我尝试什么,它似乎都无法摆脱我的内存泄漏。有人有什么建议吗?

每次展示时,我的 ViewController 中每个 NSDate 都会发生 16 字节的内存泄漏。

-(void)initialise:(id)sender withDate:(NSDate *)date withMinimumDate:(NSDate *)minimum {
    delegate = sender;
    self.originalDate = [[NSDate alloc] init];
    self.originalDate = date;

    self.minimumDate = [[NSDate alloc] init];
    self.minimumDate = minimum;
}

- (void)dealloc {
    [self.originalDate release];
    [self.minimumDate release];

    [super dealloc];
}

我尝试在第一次分配 NSDates 之前释放和/或使它们为零,并在 dealloc 方法中将它们设置为 nil。

它们在 Header 中被声明为非原子和保留属性。

我是否遗漏了一些基本的东西,还是有更复杂的答案?

【问题讨论】:

  • 你是使用ARC还是手动内存管理?

标签: xcode memory-leaks nsdate


【解决方案1】:

您正在为originalDate 执行NSDatealloc/init,但随后立即放弃它并将其设置为等于date 参数,可能会泄漏您创建的NSDate。您也在使用minimumDate 进行此操作。

至少,删除执行 alloc/init 的那两行,您随后放弃了两个相应的 NSDate 对象以支持 initialise 方法的参数。


顺便说一句,如果您使用静态分析器(“产品”菜单上的“分析”或按 shift+命令+B):

在编写手动引用计数代码时,静态分析器对于识别问题非常重要。你真的应该从分析仪那里得到一份干净的健康清单。您可以单击蓝色图标,它通常会随着我在上面屏幕快照中显示的描述和箭头展开。

注意,这也突出了self.originalDate(而不是_originalDate,或任何支持实例变量)在您的dealloc 方法中的不当使用。正如我在之前的评论中提到的,你should not use accessor methods in dealloc method

【讨论】:

  • 这一次似乎 ARC 和 MRC 之间的差异让我感到困惑。非常感谢好心的先生。
  • @Ollie 我鼓励您查看静态分析器,它将在未来为您识别这些类型的问题。这是一个很好的工具,如果做 MRC,它是无价的。请参阅我修改后的答案。
【解决方案2】:

这两行正在创建对从未释放的对象的引用。

self.originalDate = [[NSDate alloc] init];

self.minimumDate = [[NSDate alloc] init];

当您立即用新值覆盖这些属性时,您只需要删除这两行(它们冗余地分配了从未使用过的 NSDate 对象)并且您的泄漏应该消失了。

您还应该检查委托是否也进行了适当的内存管理,因为我在dealloc 中没有看到委托变量的释放。

【讨论】:

  • 关于delegate 的最后一点,你说得对。但是如果他有一个retain cycle,尝试在dealloc 中释放它可能无法解决它(因为直到对象的保留计数降至零,即直到保留周期已解决,才会调用dealloc) .通常最好确保delegate 属性为weak/assign,从而完全避免保留周期风险。这仅取决于 delegate 的声明方式。
  • 是的,很可能被分配了。我只是想我会指出它以防万一,因为我看到 Ollie 选择不使用属性访问器,所以它可能不小心被分配了。
猜你喜欢
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
  • 2011-10-31
  • 2019-08-10
  • 2013-06-24
相关资源
最近更新 更多