6 votes

Ajout de chaînes de caractères à NSMutableString

J'ai regardé cela depuis un certain temps maintenant et je ne comprends pas pourquoi ce simple bout de code génère une erreur. Raccourci pour la brièveté :

NSMutableString *output;

...

@property (nonatomic, retain) NSMutableString *output;

...

@synthesize output;

...

// logs "output start" as expected
output = [NSMutableString stringWithCapacity:0];
[output appendString:@"output start"];
NSLog(@"%@", output);

...

// error happens here
// this is later on in a different method
[output appendString:@"doing roll for player"];

Quelqu'un peut-il repérer mon erreur ?

2voto

Nick Moore Points 7897

Changez la ligne

output = [NSMutableString stringWithString:@"output start"]

à

[self setOutput:[NSMutableString stringWithString:@"output start"]]

(ou self.output = ... si vous préférez cette notation).

Bien que vous ayez déclaré une propriété, vous n'utilisez pas le setter, et vous ne conservez donc pas la chaîne.

1voto

typeoneerror Points 19087

La solution était en fait liée à la rétention, comme l'indique l'utilisateur invariant . La méthode de la classe :

output = [NSMutableString stringWithCapacity:0];

renvoie un autorelease NSMutableString. Lorsqu'elle a été affectée à ma propriété de sortie - apparemment, même avec le drapeau de conservation - elle ne l'a pas conservée. La solution était de l'allouer moi-même et de ne pas l'autorelease :

output = [[NSMutableString alloc] initWithCapacity:0];

Puis la retenue a fonctionné. Toute explication du pourquoi serait la bienvenue.

Modifier

J'ai compris pourquoi. J'accédais aux variables d'instance directement au lieu de passer par le getter/setter que j'ai synthétisé. Plus d'informations sur mon blog .

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