0 votes

Qu'est-ce qui pourrait affecter la durée de vie d'une NSString retournée par stringWithContentsOfFile" ?

Considérez les 2 méthodes suivantes pour lire une chaîne de caractères dans un fichier :

NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];
NSString *string = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:NULL];

NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
NSData *data = [file readDataToEndOfFile];
NSString *string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
[file closeFile];

Je préférerais me fier à la méthode n° 1, mais elle se comporte étrangement lorsqu'elle est utilisée dans le contexte suivant :

NSString *string; // CLASS VARIABLE
(void) setupView
{
  string = ...; // LOADING THE STRING
}
(void) drawView
{
 ...;  // USING THE STRING
}

En bref, il s'agit d'une boucle de dessin OpenGL-ES basée sur un NSTimer. Le problème est que la chaîne n'est accessible qu'à la première image. A l'image suivante, le simulateur IPhone (2.2) se plante en essayant d'accéder à la chaîne.

Probablement "quelque chose dans mon code, ou dans le code OpenGL-ES que j'utilise" pourrait-on dire... Mais comment expliquer le fait étrange que si j'utilise la méthode n°2 pour charger la chaîne, tout fonctionne comme prévu ?

Des indices ?

1voto

Pedro Henriques Points 835

Lorsque vous créez une chaîne avec une méthode de classe, elle est généralement ajoutée au pool d'autorelease le plus élevé. À la fin de la boucle d'événements, le pool envoie un message de libération à tous les objets qu'il contient. Dans ce cas, la chaîne nouvellement créée a un nombre de retenue égal à 1 et à la fin de la boucle, elle atteint 0 et est désallouée. Si vous souhaitez conserver la chaîne, envoyez-lui un message de conservation pour que le nombre de conservation reste positif à la fin de la boucle d'événements.

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