2010-08-09 13 views
1

Juste une question simple sur NSStrings, j'ai un morceau de code qui attribue une valeur à une chaîne, en fonction de ce qui est trouvé soit une valeur par substringToIndex ou la chaîne constante @ "0.00", est-il correct d'utiliserNSString Assignment & Retaining

// Save if value found, otherwise set to 0.00 
if (parsedCharacters == nil || [parsedCharacters isEqualToString:@""]) 
     self.currentDiscountedPrice = @"0.00"; 
else 
{ 
    // Truncate extra digits from string to 2 decimal places (find full stop, save 2 places after it) 
    NSRange fullStopRange = [parsedCharacters rangeOfString:@"."]; 
    self.currentDiscountedPrice = [parsedCharacters substringToIndex:(fullStopRange.location + 3)]; 
} 

pour l'affectation car il libérera l'ancienne valeur & conserver la nouvelle valeur?

Il est impossible de savoir si la variable constante a été affectée à la variable constante ou si la valeur retournée par substringToIndex dans l'itération précédente est conservée.

+0

Ce que je vous demande essentiellement est, dans le code ci-dessus dois-je libérer plutôt explicitement l'ancienne valeur et conserver la valeur substringToIndex ou il correct d'utiliser juste self.currentDiscountedPrice = pour les deux missions? –

+0

OT: au lieu de 'parsedCharacters == nil || [parsedCharacters isEqualToString: @ ""] ', j'écrirais' parsedCharacters.length == 0'. En raison de la sémantique message-à-zéro d'Objective-C, cela détectera «nil», il est probable qu'il soit légèrement plus rapide pour les non-nulles, et bien sûr plus simple. –

Répondre

1

NSString n'est pas particulière; tous les objets Cocoa suivent the Cocoa memory-management rules. Tant que vous faites, aussi, tout ira bien.

on m'a dit d'appeler conserver & la libération sur une chaîne constante est inoffensive, cela est vrai?

Oui. Vous devriez les traiter de la même façon que toute autre chaîne que vous ne possédez pas: Conservez-la si vous voulez la posséder, ou faites-en une copie et possédez-la; alors assurez-vous de libérer ce que vous possédez.

... dois-je libérer plutôt explicitement la valeur ancienne & conserver la valeur substringToIndex ou il correct de simplement utiliser self.currentDiscountedPrice = pour les deux missions?

Vous devez utiliser la propriété partout mais init méthodes et dealloc. Ce sont les seules méthodes qui devraient explicitement envoyer retain et release messages à l'objet dans la variable d'instance.

La raison pour les deux parties de ce paragraphe est que vous, ou une sous-classe, peut mettre en œuvre des accesseurs personnalisés pour la propriété. Le comportement personnalisé peut être dangereux d'avoir été exécuté sur un objet semi-initié ou à demi-débloqué, mais vous le voudrez probablement partout ailleurs.

Il n'y a pas de mal à faire passer un objet chaîne constante à un setter de propriété. Il conservera ou copiera l'objet normalement.

Sur cette note, lorsqu'une valeur de la propriété est un objet d'une classe avec une variante mutable (comme NSString a NSMutableString), vous devez déclarer la propriété que la copie de sa valeur (@property(copy) ou @property(nonatomic, copy)), afin que vous ne prendre la copropriété de l'objet mutable de quelqu'un d'autre. Si elles muent l'objet, cela pourrait vous causer des problèmes, en particulier si vous avez stocké l'objet dans une collection de hachage (comme une clé de dictionnaire) plutôt que dans une variable d'instance.

+0

Merci Peter. –