iOS Copy与Strong详解

2019-09-25  本文已影响0人  做个有趣的程序员

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,避免出现上述问题。

上一篇下一篇

猜你喜欢

热点阅读