最近在開發(fā)中遇到一個小bug劝篷,bug引起的原因是我在聲明一個屬性時對一個NSMutableString類型的數(shù)據(jù)使用了copy随闺,但是賦值的是個NSString類型的值备徐,接下來我調用了可變字符串的拼接方法另绩。造成了崩潰。
@property (nonatomic, copy)NSMutableString *name;
接下來分析崩潰的原因南吮。
在平時的開發(fā)中一般對于NSString這種常見的類型使用strong或者copy就行修飾琳彩,如無特別要求兩者皆可用。但畢竟是兩種不同的類型部凑,還是有差異的:
- strong的情況下默認生成的setter方法如下
-(void)setName:(NSString *)name{
_name = name;
}
- copy情況下生成的setter方法如下
- (void)setName:(NSString *)name{
_name = [name copy];
}
這時我在我的代碼中給name屬性賦值
NSMutableString *str = [NSMutableString stringWithFormat:@"bin"];
Dog *dog = [[Dog alloc] init];
dog.name = str;
在使用strong的情況下直接是把str賦值給了dog的name變量露乏。此時如果我在別處改動str將會造成dog的name隨之改變,因為他們指向同一份內存涂邀。但是我如果使用的是copy施无,就會執(zhí)行copy特征的setter方法。此時dog的name變量獲取的僅僅是str進行copy后的一個不可變副本必孤。即使改動了str也不會造成dog的name改變。相比這也是蘋果寫的所有屬性中字符產用copy的原因吧。但是如果賦值的數(shù)據(jù)str不是可變字符串這里strong和copy效果一樣敷搪。
還回到我的崩潰原因兴想,由于我用的copy,所以不管你給我傳入的可變還是不可變赡勘,我接收到的肯定都是不可變的嫂便,但是我又在屬性處寫的NSMutableString。造成 一種我一定是可變字符串的假象闸与,這時候如果我不小心調用了一些僅有不可變字符串才有的方法就會拋出異常毙替。
所以建議如果是NSMutableString用strong,因為如果是strong的話如果你傳入的值是NSString践樱,直接Xcode會有個警告提醒你傳值有問題厂画,早發(fā)現(xiàn)早治療。