簡體   English   中英

如何在 Objective-C 中使用“復制”屬性?

[英]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是安全的,但是雖然數組本身不會被修改,但數組持有的對象共享相同的參考。 對於任何集合類( NSDictionaryNSSet等)也是如此
  • 如果該屬性與自定義類匹配,您需要確保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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM