2011-03-27 2 views
0

La méthode dealloc de mon point de vue classe contrôleur est pas appelé quand fait éclater après avoir été poussé avec le code suivant:En utilisant la notation auto dot ne remet pas dealloc

self.playerViewController = [[VideoPlayerViewController alloc] init]; 

[self.playerViewController set_video:video]; 

    [self.navigationController pushViewController:self.playerViewController animated:YES]; 

[self.playerViewController release]; 

Cependant, si je change le code de poussée à ce qui suit , alors mon dealloc est appelé de manière appropriée après que le contrôleur de vue est crevés:

playerViewController = [[VideoPlayerViewController alloc] init]; 

[playerViewController set_video:video]; 

[self.navigationController pushViewController:playerViewController animated:YES]; 

[playerViewController release]; 

Je croyais avoir compris l'utilisation de la notation dot/auto, mais évidemment pas. Quelqu'un peut-il expliquer le problème ici?

Voici la propriété:

@property (nonatomic, retain) VideoPlayerViewController *playerViewController; 

et est ici synthétisent:

@synthesize playerViewController; 
+0

Au lieu de [self.playerViewController], il s'agit de self.playerViewController = nil; Notez que cet AQ est extrêmement périmé sur le plan technologique. – Fattie

Répondre

3

Vous retenez deux fois.

self.playerViewController = [[VideoPlayerViewController alloc] init]; 
    ^retain + 1          ^^^^^ retain + 1 

Mais vous ne publiez qu'une seule fois.

Pour résoudre votre problème de gestion de la mémoire, vous pouvez modifier le code à quelque chose comme ceci:

self.playerViewController = [[[VideoPlayerViewController alloc] init] autorelease]; 

Et beaucoup de gens disent [self.foo release] est mauvais style. Vous devriez envisager de le remplacer par [foo release]

+2

J'irais au-delà du 'mauvais style' et dirais que '[self.foo release]' est une erreur. En supposant que 'foo' est une propriété retain, cette ligne libère et libère potentiellement l'objet sur lequel pointe' foo', laissant un pointeur incorrect dans sa propriété foo. L'utilisation de 'self.foo' à ce moment-là provoquera un crash. L'attribution d'une nouvelle valeur à 'self.foo' provoquera également un crash, puisque le setter va d'abord essayer de libérer l'objet (anciennement) existant. – Caleb

+0

Doh. Je me souviens juste que nous parlons de '-dealloc' ici, donc il n'y a pas beaucoup de chance que quelqu'un utilise' self.foo' après ce point, mais cela semble encore très faux. – Caleb

Questions connexes