Objective-C内存管理 - 非常确定我做错了

时间:2011-01-14 04:18:46

标签: iphone objective-c memory-management

大约3个小时后,我终于设法修复了视图控制器中的内存泄漏。泄漏是由UIPickerView引起的,该属性在头文件中设置为“retain”。

以下代码设法修复它:

- (void)viewDidLoad {
    [super viewDidLoad];    
    myPicker = [[[UIPickerView alloc] initWithFrame:CGRectZero]autorelease];
}

- (void)dealloc {
    [super dealloc];
    [myPicker release];
    myPicker = nil;
}

请不要告诉我这段代码有多么令人震惊......我知道这很糟糕。我有一个发布,自动发布。问题是,如果我更改或删除上面的任何部分,内存泄漏就会返回。

我虽然知道C内存管理是如何工作的,但显然不是......

为什么上面的代码修复了内存泄漏,以及代码的正确版本可能是什么样的?

-

编辑:

如果有人有同样的问题,或者有兴趣 - 问题是我班级中的其他一个对象被设置为“保留”而不是“分配”。 (如果您没有对象,则应该具有属性assign,而不是保留)。

就像Cannondale所说,删除额外的保留会修复所有内容,只需要一个版本。

2 个答案:

答案 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];
}