NSMutableDictionary的内存泄漏问题

时间:2010-07-22 14:52:49

标签: objective-c nsmutabledictionary

我正在编写一个类似的程序:

- (void)viewDidLoad {
    [super viewDidLoad]; propertyList = [[NSMutableDictionary alloc] init];
    for (SensorData* _data in _res) {
        AttributeLine* newLine=[[AttributeLine alloc] init:idx];
        [propertyList setObject:newLine forKey:[_data textValue]];
        [newLine release];
    }
}

- (void)dealloc {
    [propertyList release];
    [super dealloc];
}

这不是完整的代码,但有我所做的逻辑。问题是:当程序到达[propertyList release]指令时,使用EXEC_BAD_ADDRESS失败。如果我评论该指令一切顺利,但我有内存泄漏。 有什么想法吗?

[由bbum编辑:marco在下面说他的dealloc是正确的,代码仍在崩溃]

5 个答案:

答案 0 :(得分:2)

-dealloc中,您[super dealloc]而不是[super release][super dealloc]应该是-dealloc方法的最后一行。

- (void)dealloc {
    [propertyList release];
    [super dealloc];
}

答案 1 :(得分:1)

如果您的代码确实是正确的,就像您在答案中所说的那样(我编辑了您的问题),那么还会有其他事情发生。

首先,发布崩溃的回溯以及崩溃前发生的任何控制台消息。

其次,打开僵尸(使用Instruments的Allocations乐器中的Zombie Detection模式),看看你是否得到了一些额外的线索。

最后,您可能会在AttributeLine的{​​{1}}方法崩溃吗?由于取消分配-dealloc字典,这些对象也可能被取消分配。

答案 2 :(得分:0)

您应该将[propertyList release]移至dealloc的第一行,然后将[super release]更改为[super dealloc]。您不想发布超级,您想在其上调用dealloc

答案 3 :(得分:0)

我建议在viewcontroller的initWithNibName:bundle:initWithCoder:(或两者)中初始化NSMutableDictionary,因为viewDidLoad可以被多次调用。第二次会发生,你会泄漏。另外,你的dealloc方法是错误的。它应该是

-(void) dealloc {
     [propertyList release];
     [super dealloc];
}

EXC_BAD_ADDRESS可能是由你的dealloc方法造成的。

答案 4 :(得分:0)

我解决了问题:一切都与AttributeLine的-dealloc方法相关联。我的AttributeLine对象由三个标签组成,在我之前编写的-dealloc中,对于我称之为-dealloc方法的所有标签。相反,我呼吁每个标签它的发布方法和eveything现在似乎。没有程序中断,也没有内存泄漏!

谢谢你的支持!