Un NSString littéral est-il auto-publié ou doit-il être publié?
-
11-07-2019 - |
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?
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
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é "
NSString *str = [NSString string];
est équivalent à:
NSString *str = [[[NSString alloc] init] autorelease];
so release
ou autorelease
ne doit pas non plus être passé ici.