2011-11-13 52 views
1

現在我總是做同樣的:爲什麼要複製NSString而不是保留它?

NSString *ran = @"check"; 

現在,當我想複製nsstring1到nsstring2,我在這裏已經告訴我,我必須複製/保留的NSString例如,在各種方法(與財產保留/複製)..

NSString *animation = [ran copy]; 

我知道並理解如何做到這一點,但不能理解爲什麼。

這裏的內存究竟發生了什麼?我只是不明白,當我做複製/保留的事情時發生了什麼,我應該什麼時候這樣做? (在上面的第一個例子中也是??)

這裏的所有解釋都是關於複製/保留之間的區別,但是我找不到關於REASON的任何內容,我必須複製一個類實例。

回答

5

如果你需要它是不可變的,你會複製一個字符串,並且你不知道它是不可變的。假設你有這樣的方法:

- (void)setName:(NSString *)newName 
{ 
    _name = [newName retain]; 
} 

你指望我打電話給你的方法是這樣的:

[yourObject setName:@"Rob"]; 

不過,我可能不是這樣做:

NSMutableString *sneaky = [NSMutableString stringWithString:@"Rob"]; 
[yourObject setName:sneaky]; 

,然後一段時間後,我可能會這樣做:

[sneaky appendString:@"ert"]; 
// sneaky is now @"Robert" 

既然你的setName:方法只保留了它傳遞的字符串,我已經改變了你的私有變量的值,但你並不知道它。也許你依靠它不會改變。

爲了防止這種sneakiness,你可以寫你這樣的setName:方法:

- (void)setName:(NSString *)newName 
{ 
    _name = [newName copy]; 
} 

現在你創建的我通過任何名義不可改變的副本,如果我通過一個可變的字符串,然後改變它。 ,您的_name不會受到影響。

+0

WOW非常感謝!這是一個非常好的解釋! ,但現在,發佈呢?何時和爲什麼我應該釋放該新名稱?以及爲什麼仍然使用保留? – Curnelious

+0

另一件事,在你的例子中,爲什麼我不能在setname中做:_name = newName?爲什麼我需要保留這個? – Curnelious

+0

您需要保留以讓系統知道您希望對象留在附近。否則,它可能會釋放它。當你完成它的時候你釋放這個對象,這樣系統知道它可以釋放它(如果沒有人願意的話)。如果使用ARC(自動引用計數),則不必保留或釋放。 ARC可在Mac OS X 10.7和iOS 5.0中使用。 –

相關問題