Xcode NSDate内存泄漏
我曾在其他论坛中寻找过这个问题的答案,但无论我怎么尝试,它似乎都无法消除我的记忆泄漏。有人有什么建议吗 每次我在ViewController中显示NSDate时,每个NSDate都会有16个字节的内存泄漏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
-(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选择不使用属性访问器,所以它可能是意外地没有分配的。