assign
适用于基础数据类型(NSInterger
...),不增加引用计数
copy
与strong
的区别
先来看一个例子
@property(nonatomic, copy) NSString *cName;
@property(nonatomic, strong) NSString *sName;
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *str = [NSMutableString stringWithString:@"abc"];
self.cName = str;
self.sName = str;
NSLog(@"str:%p,%p", &str, str); 0x7fff5d804aa8,0x7f81e2d11b10
NSLog(@"cName:%p,%p", &_cName, _cName);0x7f81e2e8de20,0xa000000006362613
NSLog(@"sName:%p,%p", &_sName, _sName);0x7f81e2e8de28,0x7f81e2d11b10
[str appendFormat:@"def"];
NSLog(@"str:%p,%p", &str, str); 0x7fff5d804aa8,0x7f81e2d11b10
NSLog(@"cName:%p,%p", &_cName, _cName);0x7f81e2e8de20,0xa000000006362613
NSLog(@"sName:%p,%p", &_sName, _sName);0x7f81e2e8de28,0x7f81e2d11b10
}
_cName
指向的地址与str
指向的地址不同,是因为copy
修饰的变量指向的是str
进行深复制
后的对象地址。
如果把代码稍加修改
NSString *str = @"abc";
str = @"123";
str: 0x7fff5681faa8,0x1093e0078
cName:0x7fa863f96610,0x1093e0078
sName:0x7fa863f96618,0x1093e0078
str: 0x7fff5681faa8,0x1093e00f8
cName:0x7fa863f96610,0x1093e0078
sName:0x7fa863f96618,0x1093e0078
因为str
为不可变对象
,所以重新赋值后str
指向的地址也发生了变化
对于字符串来说,如果是赋值的对象是NSString
类型的,那么用copy
和strong
是一样的,如果赋值的是NSMutableString
类型,那么可以根据需求来确定使用copy
或strong
。
网友评论