我在其他论坛中搜索过这个问题的答案,但无论我怎么做,它似乎都没有摆脱我的内存泄漏。有人有什么建议吗?
每次呈现时,我的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中被声明为非原子和保留属性。
我错过了一些基本的东西,还是有更复杂的答案?
答案 0 :(得分:2)
您正在为alloc
执行init
/ NSDate
originalDate
,但随后立即放弃并将其设置为date
参数,可能泄漏您创建的NSDate
。你也是用minimumDate
做的。
至少应删除那两条alloc
/ init
个对象的NSDate
/ initialise
行,这些对象随后放弃以支持{{1}的参数方法。
顺便说一句,如果您使用静态分析器(“产品”菜单上的“分析”或按 shift ,则会突出显示此问题(以及dealloc
问题) + 命令 + 乙):
编写手动引用计数代码时,静态分析器对于识别问题非常有用。你真的应该从分析仪上获得一份干净的健康状况。您可以单击蓝色图标,它通常会随着我在上面的屏幕快照中显示的描述和箭头进行扩展。
请注意,这也突出显示self.originalDate
方法中_originalDate
(而不是dealloc
,或任何后备实例变量)的不当使用。正如我在之前的评论中提到的那样,你should not use accessor methods in dealloc method。
答案 1 :(得分:0)
这两行正在创建对永不释放的对象的引用。
self.originalDate = [[NSDate alloc] init];
self.minimumDate = [[NSDate alloc] init];
看到你立即用新值覆盖这些属性,你只需要删除这两行(它们冗余地分配从未使用过的NSDate
个对象),你的泄漏就会消失。
您还应检查委托是否也是正确的内存管理,因为我在dealloc
中看不到委托变量的释放。