NSString為什么要使用copy修飾而非strong

關(guān)于NSString,NSArray,NSDictionary等擁有mutable的類型,作為屬性的時候,一定要使用copy修飾符號?通過代碼來演示這么做的原因

@property (nonatomic, strong) NSString *p1;

@property (nonatomic, copy) NSString *p2;

//上面為聲明的兩個屬性,分別使用strong與copy修飾

????NSMutableString *str = [NSMutableString stringWithFormat:@"ObjectiveC"];

? ? self.p1= str;

? ? self.p2= str;

? ? NSLog(@"str=%p,? %p",str, &str);

? ? NSLog(@"strong_Str=%p,? %p", _p1, &_p1);

? ? NSLog(@"copy_Str=%p,? %p", _p2, &_p2);

打印輸出結(jié)果如下:

打印結(jié)果

通過上述打印,對于源為可變類型那么會發(fā)現(xiàn)str與使用strong修飾的p1對象的地址完全是相同的;而使用copy修飾的p2對象的地址不同;可以得出copy是屬于深拷貝,strong屬于淺拷貝

接下來對str進行修改:

增加如下代碼:

????[str appendString:@"hello"];


? ? NSLog(@"str? ? ==%@",str);

? ? NSLog(@"self.p1 ==%@",self.p1);

? ? NSLog(@"self.p2 ==%@",self.p2);

輸出:

修改后輸出

通過輸出結(jié)果發(fā)現(xiàn),使用strong修飾的屬性p1輸出結(jié)果被修改啦,而使用copy修飾的屬性p2輸出結(jié)果未被修改

再看如下代碼:

?????NSString *str = @"Objective-C";

? ? self.p1= str;

? ? self.p2= str;


? ? NSLog(@"str=%p,? ? ? ? ? %p",str, &str);

? ? NSLog(@"strong_Str=%p,? %p", _p1, &_p1);

? ? NSLog(@"copy_Str=%p,? ? %p", _p2, &_p2);


? ? str =@"hello";


? ? NSLog(@"str? ? ==%@",str);

? ? NSLog(@"self.p1 ==%@",self.p1);

? ? NSLog(@"self.p2 ==%@",self.p2);

輸出如下:

nstring輸出

對于源為不可變NSString,無論是copy還是strong修飾全部為淺拷貝;

綜上所述:為了防止NSString屬性在使用過程中被Mutable子類修改,出于安全方面的考慮對于擁有mutable子類的屬性,最好使用copy修飾;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容