關(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é)果如下:
通過上述打印粉寞,對于源為可變類型那么會發(fā)現(xiàn)str與使用strong修飾的p1對象的地址完全是相同的尼荆;而使用copy修飾的p2對象的地址不同左腔;可以得出copy是屬于深拷貝,strong屬于淺拷貝
接下來對str進(jìn)行修改:
增加如下代碼:
????[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);
輸出如下:
對于源為不可變NSString,無論是copy還是strong修飾全部為淺拷貝巧还;
綜上所述:為了防止NSString屬性在使用過程中被Mutable子類修改鞭莽,出于安全方面的考慮對于擁有mutable子類的屬性,最好使用copy修飾麸祷;