2010-07-22 3 views
1

я пишу программу, которая сделать что-то подобное:с 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: марко сказано ниже, что его dealloc правильно и код по-прежнему сбой]

+0

для вашего dealloc, попробуйте [свойствоList release] прежде, чем позвонить [super dealloc]; –

+0

Что вы делаете в AttributeLine? – JeremyP

ответ

2

В -dealloc, вы [super dealloc] не [super release]. И [super dealloc] должна быть последней строкой метода -dealloc.

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

Вы должны двигаться [propertyList release] к первой строке в dealloc, а затем изменить [super release] к [super dealloc]. Вы не хотите выпускать супер, вы хотите называть его dealloc.

0

Я бы рекомендовал инициализировать NSMutableDictionary либо в initWithNibName:bundle:, либо initWithCoder: (или обоих) вашего диспетчера представлений, поскольку viewDidLoad можно вызвать более одного раза. Во второй раз, когда это произойдет, вы просочитесь. Кроме того, ваш метод dealloc неверен. Это должно быть

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

EXC_BAD_ADDRESS, вероятно, вызвано вашим плохим методом dealloc.

1

Если ваш код действительно верен, как вы сказали в ответе (и я редактировал в ваш вопрос), то происходит что-то еще.

Во-первых, разместите обратную трассу аварии и любые сообщения консоли, которые произойдут до сбоя.

Во-вторых, включите зомби (используйте режим обнаружения зомби в инструменте «Распределения инструментов») и посмотрите, есть ли у вас дополнительные подсказки.

И, наконец, возможно, вы рухнете в AttributeLine's -dealloc метод? В результате освобождения словаря propertyList эти объекты также могут быть освобождены.

0

Я решил проблему: все связано с методом -dealloc AttributeLine. Мой объект AttributeLine состоит из трех ярлыков и внутри -dealloc, которые я написал ранее, для всех этих меток, которые я назвал их методом -dealloc. Теперь вместо этого я вызываю для каждого ярлыка его метод выпуска, и все, кажется, сейчас идет. Без прерывания программы и утечек памяти!

Благодарим вас за поддержку!

Смежные вопросы