2009-11-03 3 views
8

Je développe depuis longtemps l'objectif C et le framework Cocoa. Cependant, il n'est toujours pas clair pour moi, quand je suis supposé mettre les références d'objet à zéro. Je sais qu'il est recommandé de le faire juste avant de libérer un objet qui a un délégué et vous devriez également le faire dans la méthode viewDidUnload pour les sous-vues conservées. Mais quand exactement cela devrait-il être fait et pourquoi? Qu'est-ce que ça fait exactement? Merci d'avance.Objectif C iPhone quand mettre les références d'objet à zéro

-Oscar

Répondre

40

Supposons que vous avez un pointeur myView défini dans votre classe interface:

@interface MyClass { 
    UIView *myView; 
} 

@end 

Puis dans votre code, à un moment donné, vous pouvez libérer cette variable:

[myView release]; 

Après cela, myView, le pointeur ne pointera pas vers zéro, mais pointera vers une adresse de mémoire d'un objet qui n'existe peut-être plus (s même si vous venez de le libérer). Donc, s'il vous arrive de faire quelque chose après cela, comme:

[myView addSubview:otherView]; 

vous obtiendrez une erreur.

Si, d'autre part, vous faites ceci:

[myView release]; 
myView = nil; 
... 
[myView addSubview:otherView]; 

l'appel à addSubview n'aura aucun impact négatif, puisque les messages à zéro sont ignorés.

En corollaire, vous pouvez voir les suggestions de l'utilisation des propriétés retain, telles que:

@property(retain) UIView *myView; 

puis dans le code, il suffit de faire:

self.myView = nil; 

En faisant cela, l'accesseur synthétisé va libérer l'ancien objet et mettre la référence à zéro dans une ligne de code. Cela peut s'avérer utile si vous voulez vous assurer que toutes vos propriétés sont libérées et réglées à zéro.

Une chose que vous ne devez jamais oublier, c'est que la gestion de la mémoire est faite au moyen de retainrelease appels, et non pas en assignant nil. Si vous avez un objet avec un nombre de retenue de 1, et que vous affectez nil à sa seule variable, vous perdrez de la mémoire:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)]; 
view = nil; 
// You just leaked a UIView instance!!! 
+0

Tout programmeur Cocoa devrait lire ceci. J'ai lu Kochan, Hillegass et les docs d'Apple, et il m'a fallu près de 6 mois pour comprendre certains des concepts pgb expliqués ici. Cela me semble évident maintenant, mais ce n'était certainement pas le cas auparavant. vote ++ – refulgentis

+0

Bonne réponse !!! Merci beaucoup. –

Questions connexes