我不知道在判斷ObjectiveC中的給定屬性應該是retain
還是copy
時,您是否遵循了一條經驗法則?使用@property(copy)和@property(retain)的經驗法則是什麼?
你如何決定它應該是什麼?
我不知道在判斷ObjectiveC中的給定屬性應該是retain
還是copy
時,您是否遵循了一條經驗法則?使用@property(copy)和@property(retain)的經驗法則是什麼?
你如何決定它應該是什麼?
通常使用copy
安全與具有可變的變種類,像NSString
,NSArray
,其他集合類等。要知道爲什麼,考慮在這裏會發生什麼......
曾幾何時,
@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)
!
簡而言之,assign
VS retain
VS copy
確定所合成的訪問器如何與目標C內存管理方案進行交互:
assign
是默認設置,簡單地執行變量賦值retain
指定新值應發送 - 在賦值時保留並將舊值發送發佈copy
指定應發送的新值-copy將賦值和舊值發送發佈。記住retain
被創建的對象(它增加了引用計數),而copy
上完成創建一個新對象。所不同的是,你是否想要添加另一個保留到對象或創建一個全新的對象。
雖然你在技術上是正確的,但OP是問*爲什麼要使用每個選項,而不是*選項是什麼。 :) – jtbandes
+1如果你啓用殭屍,然後欣喜*應*打印「BRAAAAIIINNNSSSSS」;) –
最佳答案 – Delete