Question

Lors de la création d'une chaîne utilisant la notation suivante:

NSString *foo = @"Bar";

Faut-il libérer toto ? Ou bien toto est-il auto-publié dans ce cas?

Était-ce utile?

La solution

Les chaînes allouées au compilateur (au format @ "STRING") sont constantes et les messages -retain, -release et -autorelease qui leur sont destinés sont donc ignorés. Dans ce cas, vous n'avez pas besoin de libérer ou d'auto-autoriser foo (mais cela ne fera pas mal).

Autres conseils

Comme mentionné dans la documentation

http://developer.apple.com/documentation/ Cacao / Conceptuel / MemoryMgmt / Tasks / MemoryManagementRules.html

  

Vous prenez possession d'un objet si vous   créez-le en utilisant une méthode dont le nom   commence par «alloc» ou «new» ou   contient «copie» (par exemple, alloc,   newObject ou mutableCopy), ou si vous   envoyez-lui un message de retenue. Vous êtes   responsable d'abandonner   propriété des objets que vous possédez avec   libérer ou autorelease. N'importe quel autre moment   vous recevez un objet, vous ne devez pas   libérez-le.

Puisque vous n'utilisez pas alloc, copy, etc., vous n'avez pas à vous soucier de la libération de l'objet.

Je suis d’accord avec @Ben \ Gottlieb sous "Les chaînes allouées au compilateur (du format @" STRING ") sont des constantes " mais comme vous ne les avez pas initialisés en passant un message alloc ou conserver , vous ne devez pas transmettre release ou autorelease leur envoyer un message, sinon votre application se plantera dans le journal suivant

  

" le pointeur libéré n'était pas   alloué "

REMARQUE

NSString *str = [NSString string];

est équivalent à:

NSString *str = [[[NSString alloc] init] autorelease];

so release ou autorelease ne doit pas non plus être passé ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top