2010-08-09 73 views
1

只是一個關於NSStrings的簡單問題,我有一段代碼給一個字符串賦值,這取決於發現它是由substringToIndex賦值還是常量字符串@「0.00」,是不是好使用NSString作業和保留

// 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)]; 
} 

的分配,因爲它會釋放舊的價值&保留新的價值?

有沒有辦法知道該var是否分配了常量字符串或substringToIndex返回值在前面的迭代,但我被告知調用保留&釋放常量字符串是無害的,這是真的嗎?

+0

我基本上要問的是,在上面的代碼中,我應該明確地釋放舊值並保留substringToIndex值,或者可以使用self.currentDiscountedPrice =來分配這兩個值嗎? – 2010-08-09 09:00:14

+0

OT:而不是'parsedCharacters == nil || [parsedCharacters isEqualToString:@「」]',我會寫'parsedCharacters.length == 0'。由於Objective-C的message-to-nil語義,這會檢測到'nil',非零時它可能會稍微快一點,當然更簡單。 – 2010-08-09 10:49:46

回答

1

NSString不是特殊的;所有的可可物體都遵循the Cocoa memory-management rules。只要你也這樣做,你會沒事的。

有人告訴我保留&釋放常量字符串是無害的,這是真的嗎?

是。你應該像對待你不擁有的任何其他字符串一樣對待它們:保留它,如果你想擁有它,或者複製並擁有它;那麼一定要釋放你擁有的東西。

...我應該相當明確地釋放舊值&保留substringToIndex值或將其還好只使用self.currentDiscountedPrice =兩個任務?

您應該使用屬性無處不在,但在init方法和dealloc。這些是唯一應該將retainrelease消息明確發送給實例變量中的對象的唯一方法。

該段兩邊的原因是您或其子類可能會爲該屬性實現自定義訪問器。自定義行爲可能會在半內插或半解鎖對象上運行,但您可能會在其他地方想要它。

將常量字符串對象傳遞給屬性設置器沒有任何壞處。它會照常保留或複製對象。

關於這一點,當一個屬性的值是一個類的對象有一個可變的變種(如的NSString具有的NSMutableString),你應該申報財產的複製,從而它的價值(@property(copy)@property(nonatomic, copy)),你不採取別人的可變對象的共同所有權。如果它們改變對象,這可能會給你帶來問題,特別是如果你將對象存儲在散列集合(比如字典鍵)而不是實例變量中。

+0

謝謝彼得。 – 2010-08-12 07:30:40