我正在编写一个类似的程序:
- (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是正确的,代码仍在崩溃]
答案 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现在似乎。没有程序中断,也没有内存泄漏!
谢谢你的支持!