[英]How to use “copy” property in Objective-C?
我在網上閱讀了很多資料,這些資料都解釋了人們何時應該使用“ copy
”而不是“ strong
”。
“copy 屬性是 strong 的替代品。它不是獲取現有對象的所有權,而是創建您分配給該屬性的任何內容的副本,然后獲得所有權。只有符合NSCopying
協議的NSCopying
才能使用此屬性。 ..”
並且有大量示例代碼顯示使用“復制”時,原始值保持不變。
但是,我是Objective-C
新手。 我真的很想知道如何使用新分配的值。 帶有“新值”的“新實例(副本)”在哪里? 如果我願意,是否需要任何其他方法來更改原始值?
如果有人可以分享這部分的示例,而不是證明原始值沒有改變的示例,那就太好了,這無處不在。
copy
屬性在幕后所做的是創建一個像這樣的 setter:
- (void)setMyCopiedProperty:(MyClass *)newValue {
_myCopiedProperty = [newValue copy];
}
這意味着每當有人做這樣的事情時object.myCopiedProperty = someOtherValue;
, someOtherValue
被發送一個copy
消息,告訴它復制自己。 接收者然后獲得一個新的指針(假設正確實現了copy
),除了接收者對象之外沒有人可以訪問該指針。
您可以以某種方式copy
視為排他性:
但請注意以下警告:
NSArray
不會復制其對象,因此您最終可能會認為@property(copy) NSArray<MyClass *> *myProperty
是安全的,但是雖然數組本身不會被修改,但數組持有的對象共享相同的參考。 對於任何集合類( NSDictionary
、 NSSet
等)也是如此copy
方法完成其工作 - 即創建一個新對象。 發生這種情況的符合所有的Cocoa / CocoaTouch類NSCopying
,但是對於其他類,不過這是否不是真實的,這取決於執行(我自己,我也沒鋸但一類謊言的copy
方法,但是你永遠不知道)試試這個:
模型.h
@interface Model: NSObject
@property (nonatomic,strong)NSString *firstName;
@property (nonatomic,copy) NSString *lastName;
@end
視圖控制器.m
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
Model *model = [[Model alloc]init];
NSMutableString *str = [[NSMutableString alloc]initWithString:@"test"];
model.firstName = str;
model.lastName = str;
NSLog(@"%@, %@", model.firstName, model.lastName);
[str appendString:@"string"];
NSLog(@"%@, %@ ", model.firstName, model.lastName);}
Output :
1st Nslog = "test", "test"
2nd Nslog = "teststring", "test"
類的實例是離散副本。 當您將類的實例分配為具有copy
屬性的屬性值時,會創建該實例的克隆,並且該克隆成為該屬性的值。 原始實例與其克隆之間沒有任何關系,因此該屬性根本無法訪問原始實例。 更改屬性值的屬性就是更改克隆。
注意:
如果您為copy
屬性實現 setter,則您有責任確保它實際上創建了一個副本。 與屬性的所有屬性一樣,它們僅在編譯器為您生成(合成)setter 和/或 getter 時才有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.