2011-06-22 40 views
7

所以,只是一個簡單的問題,何時應該使用副本而不是使用保留。我試圖從互聯網上看,但沒有完全明白。那麼有人可以照亮我嗎?客觀C複製並保留

+0

[NSString property:copy or retain?](http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain)或[Objective C Assign Copy Copy Retain](http:/ /stackoverflow.com/questions/4510913/)或[保留自動釋放對象的副本](http://stackoverflow.com/questions/6416963/)或[何時使用保留和何時使用副本](http:// stackoverflow .com/questions/4087208 /)或[@property:Retain or copy?](http://stackoverflow.com/questions/5616170/)或[許多其他](http://stackoverflow.com/search?q= %5Bobjc%5D + copy + retain) –

+0

在這個問題的辯護中,其他人都是特定於財產類型,但是,這個問題已經被問了很多。 –

回答

27

當你想保證對象的狀態時,你會使用copy

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString retain]; 
[mutString appendString:@"Test"]; 

在這一點上,b被第三條線弄亂了。

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString copy]; 
[mutString appendString:@"Test"]; 

在這種情況下,b是原始字符串,並且不會被第3行修改。

這適用於所有可變類型。

+4

值得注意的是,許多不可變類型將通過調用-retain來實現-copy;由於它們的價值永遠不會改變,所以在內存中擁有兩個副本是沒有意義的。也就是說,如果沒有進一步的信息,你應該總是編碼,就好像你不知道一個特定的對象是否是可變的。僅僅因爲你輸入你的屬性爲NSString並不意味着有人不會將一個NSMutableString傳遞給它(如上圖所示)。 – ipmcc

3

如果您不希望在不知道的情況下收到的值發生變化,則複製功能非常有用。例如,如果您有一個屬性爲NSString,並且您設置該字符串一旦設置就不會更改,則需要使用複製。否則,某人可以通過您NSMutableString並更改該值,從而更改NSString的基礎值。 NSArrayNSMutableArray也是一樣,除了數組上的副本只是將所有指針引用複製到新數組中,但會阻止刪除和添加條目。

7

保留:它是在創建的對象上完成的,它只是增加引用計數。

複製 - 它創建一個新的對象,當創建新的對象時,保留計數將爲1. 希望這可以幫助你。

+0

複製並不總是創建一個新對象 – newacct

+0

因此在保留我們增加引用計數到同一個對象上,而爲了複製,我們增加了一個新對象的引用計數? – Honey