2010-03-20 4 views
0

J'ai le morceau de code suivant d'un livre.devrait être libéré ou non variable? iphone-sdk

Il existe cette fonction loadPrefs dans laquelle le NSString * userTimeZone est libéré avant la fin de la fonction.

Pourquoi? La chaîne n'a pas été créée avec alloc et je suppose que la fonction stringForKey renvoie un NSString autoeleased. Est-ce une erreur ou ai-je oublié quelque chose? Est-ce une erreur dans le livre? (I nouveau en Objective-C)

Dans la documentation pour stringForKey la seule chose qu'il mentionne est:

Considérations particulières

échange de la remise chaîne est immuable, même si la valeur vous avez défini à l'origine une chaîne mutable .

Le code:

- (void) loadPrefs { 
    timeZoneName = DefaultTimeZonePref; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *userTimeZone = [defaults stringForKey: TimeZonePrefKey]; 
    if (userTimeZone != NULL) 
     timeZoneName = userTimeZone; 
    [userTimeZone release]; 
    show24Hour = [defaults boolForKey:TwentyFourHourPrefKey]; 
} 

Merci !!!!

+0

De quel livre s'agit-il? Juste pour que nous puissions l'éviter ... –

+0

iPhone SDK Development. Cependant, c'est un très bon livre, malgré cette erreur de code. – psebos

Répondre

0

Vous avez raison. Il y a deux choses qui ne vont pas avec ce code: il libère la chaîne de stringForKey: incorrectement, et pas en retenant userTimeZone lorsqu'il affecte la valeur à une variable d'instance.

est ici une meilleure tentative:

- (void) loadPrefs { 
    [timeZoneName release]; // In case there was a previous value 

    timeZoneName = DefaultTimeZonePref; // ASSUMPTION: DefaultTimeZonePref is a constant 
    // And thus doesn't need retain/release. 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *userTimeZone = [defaults stringForKey: TimeZonePrefKey]; 
    if (userTimeZone != NULL) { 
     timeZoneName = [userTimeZone retain]; 
    } 

    show24Hour = [defaults boolForKey:TwentyFourHourPrefKey]; 
} 

Et ne pas oublier de libérer timeZoneName dans dealloc.

+0

La conservation de userTimeZone ne dépend-elle pas de la façon dont il a été déclaré dans la définition de classe? –

+0

Il est défini en tant que variable d'instance. Aucune propriété, aucun setter ou getter. Juste à l'intérieur de l'interface ** NSString * timeZoneName; ** – psebos

+0

Nathan: Je pense que vous faites référence aux options "assign", "retain" et "copy" pour une déclaration de propriété. Dans ce cas, il s'agit d'une variable d'instance simple, vous n'avez donc pas à vous en préoccuper. –

Questions connexes