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 retain
release
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!!!
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
Bonne réponse !!! Merci beaucoup. –