當(dāng)屬性類型為NSString *
時(shí),我們經(jīng)常使用copy
來保護(hù)其封裝性。那么為什么這么做呢,我的習(xí)慣就是上代碼,因?yàn)槲矣X得代碼能夠說明一切。O(∩_∩)O哈哈~
廢話不說,我們看代碼:
//聲明一個(gè)字符串str1
@property (nonatomic, strong) NSString *str1; //這里是strong
//1.我們新創(chuàng)建一個(gè)可變字符串str2
NSMutableString *str2 = [NSMutableString stringWithFormat:@"str2"];
//2.把str2值賦給self.str1
self.str1 = str2;
//3.然后我們改變str2的值
[str2 appendString:@"這是添加的"];
//打印結(jié)果
NSLog(@"str1=%@",self.str1);
NSLog(@"str2=%@",str2);
我們看下打印結(jié)果:
QQ20160613-0.png
str1
居然隨著str2
的改變而變化了?。?!
為什么會這樣?
因?yàn)槿绻O(shè)置成strong
的話,str1
的setter
實(shí)現(xiàn)是這樣的:
- (void)setStr1:(NSString *)str1 {
_str1 = str1;
}
也就是說,str1
和str2
兩個(gè)指針指向同一個(gè)對象,一個(gè)變化,就會引起另外一個(gè)的改變。
如果我們把屬性設(shè)置為copy
,seeter
方法的實(shí)現(xiàn)就變成了下面的狀況:
- (void)setStr1:(NSString *)str1 {
_str1 = [str1 copy];
}
然后我們再次打印結(jié)果:
copy.png
就正確了