Xcode NSDate内存泄漏

Xcode NSDate内存泄漏,xcode,memory-leaks,nsdate,Xcode,Memory Leaks,Nsdate,我曾在其他论坛中寻找过这个问题的答案,但无论我怎么尝试,它似乎都无法消除我的记忆泄漏。有人有什么建议吗 每次我在ViewController中显示NSDate时,每个NSDate都会有16个字节的内存泄漏 -(void)initialise:(id)sender withDate:(NSDate *)date withMinimumDate:(NSDate *)minimum { delegate = sender; self.originalDate = [[NSDate al

我曾在其他论坛中寻找过这个问题的答案,但无论我怎么尝试,它似乎都无法消除我的记忆泄漏。有人有什么建议吗

每次我在ViewController中显示NSDate时,每个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方法中将其设置为零

它们在标头中声明为非原子和保留属性


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

您正在对
原始日期
执行
alloc
/
初始化
,但随后立即放弃它并将其设置为
日期
参数,可能会泄漏您创建的
NSDate
。您也在使用
minimumDate
执行此操作

至少,删除对两个相应的
NSDate
对象执行
alloc
/
init
操作的那两行代码,您随后会放弃这两行代码,以支持
初始化
方法的参数


顺便说一句,如果您使用静态分析器(“产品”菜单上的“分析”或按shift+command+B键),则此问题(以及
dealloc
问题)会突出显示:

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


注意,这也突出了
self.originalDate
(而不是
\u originalDate
,或任何支持实例变量)在
dealoc
方法中的不当使用。正如我在前面的评论中提到的,您。

这两行正在创建对从未发布的对象的引用

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

self.minimumDate = [[NSDate alloc] init];
当您立即用新值覆盖这些属性时,只需删除这两行(这两行冗余地分配从未使用过的
NSDate
对象),泄漏就会消失


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

您使用的是ARC还是手动内存管理?似乎ARC和MRC之间的差异让我感到困惑。非常感谢好心的先生。@Ollie我鼓励您查看静态分析器,它将在将来为您识别此类问题。这是一个很好的工具,如果进行MRC,它将是非常宝贵的。请看我修改后的答案。关于
委托
,您的最后一点是完全正确的。但是如果他有一个,尝试在
dealloc
中释放它可能无法解决它(因为
dealloc
在对象的retain计数降到零之前,即在retain循环解决之前,不会调用)。通常,最好确保
委托
属性为
/
分配
,从而完全避免保留周期风险。这取决于委托的声明方式。是的,它很可能被分配。我只是想指出一下,如果不是这样的话,因为我看到Ollie选择不使用属性访问器,所以它可能是意外地没有分配的。