1

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

每次我呈现它时,我的 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 为 nil,并在 dealloc 方法中将它们设置为 nil。

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

我在这里错过了一些基本的东西还是有更复杂的答案?

4

2 回答 2

2

您正在执行for的alloc/ init,但随后立即放弃它并将其设置为等于参数,可能会泄漏您创建的。你也在这样做。NSDateoriginalDatedateNSDateminimumDate

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


顺便说一句,如果您使用静态分析器(“产品”菜单上的“分析”或按+ + ),这个问题(和dealloc问题)会为您突出显示:shiftcommandB

静态分析仪

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

self.originalDate请注意,这也突出了您的方法中(而不是_originalDate,或任何支持实例变量)的不当使用dealloc。正如我在之前的评论中提到的,您不应该在 dealloc 方法中使用访问器方法

于 2013-07-05T16:24:32.660 回答
0

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

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

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

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

您还应该检查委托是否也得到了正确的内存管理,因为我没有看到dealloc委托变量的释放。

于 2013-07-05T16:32:18.897 回答