在开发中,我们经常用到一些东西,却不知道为什么这样用。看见同事用strong修饰字符串,我一直用的是copy,虽然好奇,但是也没有抽出十分钟的时间去弄清楚到底该用什么,这样的习惯的确不好,有疑惑的地方就要立刻弄明白才对。
当给copy修饰的字符串属性赋一个不可变的字符串,该属性会进行浅拷贝,当赋一个可变的字符串,会进行深拷贝,当字符串改变的时候该属性不会随着字符串的值改变而改变。
当给strong修饰的字符串属性赋值一个可变的字符串的时候,由于指向的地址是一样的,属性会随着字符串的值改变而改变。
综上所述,为了避免一些错误,尽量使用copy修饰字符串。
上面的例子就不贴验证代码了。那不可变字符串拼接了字符串之后呢会发生什么情况。
@property (nonatomic,copy) NSString * coString;
@property(nonatomic,strong) NSString * strongString;
这是两个属性
NSString* string =@"456";
self.coString= string;
self.strongString= string;
string = [string stringByAppendingString:@"789"];
NSLog(@"string---%@ coString---%@ strongString---%@",string,self.coString,self.strongString);
NSLog(@"string---%p coString---%p strongString---%p",string,self.coString,self.strongString);
打印结果:
呵呵是因为string 在执行string = [string stringByAppendingString:@"789"];这句代码之后又指向了新的地址,所以它的值改变,是不会对两个属性的值产生影响的,呵呵,是我太孤陋寡闻了。
网友评论