2013-08-29 2 views
-2

найти странный код здесь У меня есть ViewController, он имеет массив с книгами и нажмите на ячейку, а затем нажмите на detailViewController, detailVC имеет переменную infoDict,IOS dealloc аварии

@property (nonatomic,retain) NSMutableDictionary * infoDict; 

navigationController толчок

DetailViewController * tDVC = [[DetailViewController alloc] init]; 
tDVC.infoDict = infoDict; 
[self.navigationController pushViewController:tDVC animated:YES]; 
[tDVC release]; 

нажмите кнопку назад, поп-обратно, и внутри dealloc из DetailVC

-(void)dealloc 
{ 
    [super dealloc]; 

    NSLog(@"before %d",infoDict.retainCount); 
    [infoDict release]; 
} 

, но когда я возвращаюсь назад, в этом случае приложение dealloc случайно падает, EXC_BAD_ACCESS.

при перемещении [super dealloc] на дно dealloc, кажется, в норме. PLS помочь мне это понять, большое спасибо

+0

«infoDict» это правильный ваш правильный экземпляр имя переменной (кажется, должно быть _infoDict) – Injectios

+0

@Injectios курсовой мат – nickyu

+0

так что у вас есть @synthesize infoDict = infoDict; ? – Injectios

ответ

4

[super dealloc] освобождает сам объект. Если вы наберете dealloc и пусть Xcode автозаполнения, вы получите это:

- (void)dealloc 
{ 
    <#deallocations#> 
    [super dealloc]; 
} 

Значение вы должны освободить объекты и свойства перед тем вы звоните [super dealloc]

+0

почему вы не должны называть супер последним? EDIT: похоже, он удалил сообщение. –

+0

«выпускает сам объект», вы имеете в виду «deallocates»? – newacct

+0

Да, вы правы, спасибо. Я отредактировал свой ответ –

2

Ваш -dealloc реализация выходит из строя. Вызов -[super dealloc]должен быть абсолютным последним вызовом в методе dealloc. Когда вы обращаетесь к ivar infoDict, компилятор действительно делает что-то вроде self->infoDict и к этому моменту self был освобожден и был снят с подписки.

Если возможно, я рекомендую использовать ARC вместо ручного управления памятью.

+0

cool, я преобразую свой проект в Arc на следующей неделе, спасибо человеку – nickyu

-1

Попробуйте

его лучше, если вы используете self.infoDict = nil; вместо [infoDict rlease];

-(void)dealloc 
{ 
    NSLog(@"before %d",infoDict.retainCount); 
    [infoDict release]; 

    [super dealloc]; 
} 
+1

Определенно не лучше использовать аксессоры в '-dealloc'. Лучше всего использовать ARC и больше не нуждаться в '-dealloc', но если вы не можете, вам не следует использовать аксессоры в' -dealloc' или '-init' –

+0

, лучше всего Arc, но если не использовать Arc и как парень сказал, что использует dealloc, так что это означает, что он не использует Arc –

+0

Да, я получил это, мой комментарий был в ответ на ваше предположение, что лучше использовать аксессоров (например, 'self.infoDict = nil;' в вашем ' -dealloc'. Вы не должны использовать аксессоров в процедурах освобождения или инициализации. –

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