1

我正在编写一个执行类似操作的程序:

- (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是正确的,代码仍然崩溃]

4

5 回答 5

2

-dealloc,你[super dealloc]没有[super release]。并且[super dealloc]应该是-dealloc方法的最后一行。

- (void)dealloc {
    [propertyList release];
    [super dealloc];
}
于 2010-07-22T14:57:39.557 回答
1

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

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

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

最后,您可能会在AttributeLine's-dealloc方法中崩溃吗?作为解除分配propertyList字典的结果,这些对象也可能被解除分配。

于 2010-07-22T16:14:19.130 回答
0

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

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

EXC_BAD_ADDRESS 可能是由您的错误 dealloc 方法引起的。

于 2010-07-22T14:59:28.050 回答
0

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

谢谢小哥的支持!

于 2010-07-23T08:28:00.093 回答
0

您应该移动[propertyList release]到 中的第一行dealloc,然后更改[super release][super dealloc]。你不想释放超级,你想调用dealloc它。

于 2010-07-22T14:58:46.960 回答