Проблема утечки памяти с NSMutableDictionary - PullRequest
1 голос
/ 22 июля 2010

Я пишу программу, которая делает что-то подобное:

- (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 верен и код все еще не работает]

Ответы [ 5 ]

2 голосов
/ 22 июля 2010

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

- (void)dealloc {
    [propertyList release];
    [super dealloc];
}
1 голос
/ 22 июля 2010

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

Сначала опубликуйте обратный след аварии и любые сообщения консоли.это случилось до аварии.

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

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

0 голосов
/ 23 июля 2010

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

Спасибо за поддержку, парень!

0 голосов
/ 22 июля 2010

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

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

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

0 голосов
/ 22 июля 2010

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

...