簡體   English   中英

NSString屬性進行淺表復制

[英]NSString property making a shallow copy

我在理解在單獨的類中聲明的這兩個字符串屬性的狀態時遇到了一些麻煩:

@property (nonatomic, copy) NSString *userPhone;

@property (nonatomic, copy) NSString *userLogin;

我在代碼中的某個地方執行以下操作:

user.userPhone = self.userLogin;

我希望將userLogin復制到一個新對象中並分配給userPhone 但是,我發現它們都共享對同一對象的引用! 因此,當userLogin被釋放時, userPhone被釋放,從而破壞了我可憐的應用程序。

我知道我在這里缺少有關內存管理的信息,但是我不明白為什么在這種情況下copy不起作用。

有誰知道?

非常感謝

NSString對象是不可變的 ,這意味着它們的內容一旦創建便無法更改。 為了利用這一點, copy方法不會創建新的字符串。 而是保留原始字符串*。 從您的角度來看,這是內部優化, 適用標准內存管理規則。 如果您在預期之前要取消dealloc字符串時遇到問題,則必須在其他地方過度釋放它。

stringWithString:也以相同的方式在內部進行了優化。 如果您將不可變的字符串作為參數傳遞,它將不會創建新的字符串*。 如果執行以下代碼,您將看到string1和string2地址相同。

NSString *string1 = @"Test";
NSString *string2 = [NSString stringWithString:string1];
NSLog(@"%p, %p",string1, string2);

(*) 這些是實施細節,隨時可能更改。

您可能要雙重釋放原稿。 如果我還記得,copy屬性實際上只是保留一個不變的副本(即NSString),並且如果它是可變的(NSMutableString),則僅進行硬拷貝。 可能會自動釋放原始字符串,並給您硬發行版(占兩個減量)。 編輯:

閱讀其他帖子后,我改變了我的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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