大约3个小时后,我终于设法修复了视图控制器中的内存泄漏。泄漏是由UIPickerView引起的,该属性在头文件中设置为“retain”。
以下代码设法修复它:
- (void)viewDidLoad {
[super viewDidLoad];
myPicker = [[[UIPickerView alloc] initWithFrame:CGRectZero]autorelease];
}
- (void)dealloc {
[super dealloc];
[myPicker release];
myPicker = nil;
}
请不要告诉我这段代码有多么令人震惊......我知道这很糟糕。我有一个发布,和自动发布。问题是,如果我更改或删除上面的任何部分,内存泄漏就会返回。
我虽然知道C内存管理是如何工作的,但显然不是......
为什么上面的代码修复了内存泄漏,以及代码的正确版本可能是什么样的?
-
编辑:
如果有人有同样的问题,或者有兴趣 - 问题是我班级中的其他一个对象被设置为“保留”而不是“分配”。 (如果您没有对象,则应该具有属性assign,而不是保留)。
就像Cannondale所说,删除额外的保留会修复所有内容,只需要一个版本。
答案 0 :(得分:4)
您必须在代码中的其他位置对myPicker进行保留。一旦堆栈展开viewDidLoad调用,你的myPicker分配行将释放该内存(这就是autorelease告诉它做的事情)。
你必须在那之后做某个保留,否则你的[myPicker发行版]会试图释放未分配的内存,带来不可预知的结果。
您应该做的是在viewDidLoad中分配内存(因此请删除自动释放)。确保你没有在任何其他地方保留对象,并从dealloc中释放myPicker。
另外...... bbum所说的是dealloc;)
答案 1 :(得分:4)
Cannonade说的话。这应该有效:
myPicker = [[UIPickerView alloc] initWithFrame:CGRectZero];
你的dealloc
也被破坏了。调用super
始终必须是最后一次(考虑一下),这可能会导致未定义的行为。
- (void)dealloc {
[myPicker release];
myPicker = nil;
[super dealloc];
}