OC语言中,最基础的对象修饰,copy与strong的区别:
@property (nonatomic, strong) NSString *strStrong;
@property (nonatomic, copy) NSString *strCopy;
对于不可变字对象:
NSString *testStr = @"test";
self.strStrong = testStr;
self.strCopy = testStr;
NSLog(@"test:%@===%p",testStr,testStr);
NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
testStr = @"testChange";
NSLog(@"test:%@===%p",testStr,testStr);
NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
打印结果:
test:test===0x109dd7080
strStrong:test===0x109dd7080
strCopy:test===0x109dd7080
test:testChange===0x109dd7100
strStrong:test===0x109dd7080
strCopy:test===0x109dd7080
从结果可以看出:
strong修饰的字符串,值未发生变化,内存地址与原字符串相同
copy修饰的字符串,值未发生改变,内存地址与原字符串相同,内存地址拷贝
为浅拷贝。
对于可变对象:
NSMutableString *mutabStr = [[NSMutableString alloc] initWithString:@"test"];
self.strStrong = mutabStr;
self.strCopy = mutabStr;
NSLog(@"test:%@===%p",mutabStr,mutabStr);
NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
[mutabStr appendString:@"change"];
NSLog(@"test:%@===%p",mutabStr,mutabStr);
NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
打印结果:
test:test===0x60000383e550
strStrong:test===0x60000383e550
strCopy:test===0xbaf0bfda97e86f1a
test:testchange===0x60000383e550
strStrong:testchange===0x60000383e550
strCopy:test===0xbaf0bfda97e86f1a
从结果可以看出:
strong修饰的字符串,值发生了变化,内存地址与原字符串相同
copy修饰的字符串,值未发生改变,内存地址与原字符串不同,内容拷贝
为深拷贝。
从上面的对比结果可以看出,
对于不可变对象:
使用copy和strong修饰,原对象的值的变化都不会引起赋值对象值的变化。
对于可变对象:
使用copy,原对象的值的变化不会引起引用对象值的变化。
使用strong修饰,在原字符串值发生改变后,会引起赋值对象值变化。
在项目中尽量使用copy,避免出现上述问题。
网友评论