5 votes

Différence entre la libération et la libération ensuite fixée à zéro.

Quelle est la différence entre deux extraits ?

[myObj release];

et

[myObj release];
myObj = nil;

4voto

Manjunath Points 3497

Si vous libérez un objet, il deviendra un objet libre.

Et si vous essayez d'effectuer toute sorte d'opération sur l'objet libéré, votre application se plante. Pour éviter de tels accidents, il est toujours préférable "d'assigner votre objet à nil après l'avoir libéré". . Car nous savons tous que toute opération effectuée sur nil ne sera pas exécutée :)

2voto

Best Coder Points 903

C'est un grand problème de gestion de la mémoire. Si vous utilisez une propriété, vous pouvez utiliser nil sans utiliser release. Parce que la méthode setter d'une propriété fonctionne comme suit :

- (void)setObjTypes:(NSArray *)ObjTypes {
    [ObjTypes retain];
    [_ObjTypes release];
    _ObjTypes = ObjTypes;
}

Les setters augmentent le nombre de références de la variable transmise, diminuent le nombre de références de l'ancienne variable d'instance, puis fixent la variable d'instance à la variable transmise. De cette façon, l'objet a correctement un compte de référence pour l'objet stocké dans la variable d'instance tant qu'elle est définie.

La méthode setter applique automatiquement la méthode release et fixe ensuite la valeur de la variable d'instance à nil. Mais si vous n'utilisez pas la propriété, vous devez savoir qu'avant de définir la valeur nil, vous devez d'abord définir la méthode release. Si nous définissons un pointeur sur nil, cela signifie qu'il ne pointe sur aucune adresse mémoire et que si nous essayons d'accéder à cette mémoire en utilisant le pointeur ci-dessus, il y aura un crash. Et si nous appelons la méthode release sur une variable d'instance, cela libère la mémoire.

1voto

Marcelo Cantos Points 91211

Pas beaucoup. La deuxième forme vous empêche juste d'essayer accidentellement de réutiliser la mémoire comme si elle était toujours un objet. (Comme si c'était le el mismo objet, pour être précis. L'adresse mémoire est susceptible d'être réutilisée pour un nouvel objet peu de temps après).

1voto

vodkhang Points 11222

Il faut faire attention à la première, car après avoir libéré l'objet, le pointeur pointe toujours vers une mémoire endommagée et peut contenir un autre objet. Ainsi, dans le premier cas, si vous essayez [myObj release] puis [myObj doSomething], l'application peut se planter.

Mon conseil est que vous devriez toujours le mettre à zéro après la libération.

0voto

medopal Points 5070

Lorsque l'on appelle release sur un objet, le nombre de références est décrémenté. lors de l'appel à retain, le nombre de références est incrémenté.

Donc, comme les gars l'ont mentionné, le pointeur indiquera toujours le même endroit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X