2011-08-18 65 views

回答

10

通常使用copy安全與具有可變的變種類,像NSStringNSArray,其他集合類等。要知道爲什麼,考慮在這裏會發生什麼......

曾幾何時,

@interface MyClass : NSObject 
@property (retain) NSString *happyString; 
- (void)rejoice; 
@end 

後來有一天,

- (void)bigBadMethod { 
    MyClass *myObject = [[[MyClass alloc] init] autorelease]; 
    NSMutableString *theString = [NSMutableString stringWithString:@"I'm happy!"]; 
    myObject.happyString = theString; // this is allowed because NSMutableString inherits from NSString 
    [myObject rejoice]; // prints "I'm happy!" 

時,突然...

[theString setString:@"BRAAAAIIINNNSSSSS"]; 
    [myObject rejoice]; // prints "BRAAAAIIINNNSSSSS" 
} 

而你不想那樣,是嗎?所以如果你不想在不看的時候變異,使用@property (copy)

+1

+1如果你啓用殭屍,然後欣喜*應*打印「BRAAAAIIINNNSSSSS」;) –

+0

最佳答案 – Delete

2

簡而言之,assign VS retain VS copy確定所合成的訪問器如何與目標C內存管理方案進行交互:

  • assign是默認設置,簡單地執行變量賦值
  • retain指定新值應發送 - 在賦值時保留並將舊值發送發佈
  • copy指定應發送的新值-copy將賦值和舊值發送發佈。

記住retain被創建的對象(它增加了引用計數),而copy上完成創建一個新對象。所不同的是,你是否想要添加另一個保留到對象或創建一個全新的對象。

+0

雖然你在技術上是正確的,但OP是問*爲什麼要使用每個選項,而不是*選項是什麼。 :) – jtbandes

相關問題