先从NSString的copy和strong分析
这里引入对象的深复制,以及浅复制:前者是再开辟一个新的内存空间存储复制的对象,内容一样但是地址不一样;后者是复制对象的指针,所以地址是一样内容肯定也是一样。
NSString的实例均可以使用copy、mutablecopy方法,但是NSMutableString只能使用mutablecopy方法。这里面的copy方法就是浅复制,而如果使用mutablecopy就是使用深复制。
再说回使用copy等关键字定义一个NSString或者NSMutableString对象。一般情况下:
1 nonatomic:对象非原子性,一般在线程安全的要求下使用保证线程安全。
2 copy和retain:这里就好比上面说的深复制和浅复制。使用copy定义一个实例的时候,就是重新开辟一个内存空间存储。但是如果是retain就仅仅是复制实例的指针,因此如果不在arc下编程,可以查看到实例的retaincount会+1;除此之后
@property (retain,nonatomic) NSString *rStr;
@property (copy, nonatomic) NSString *cStr;
- (void)test:
{
NSMutableString *mStr = [NSMutableStringstringWithFormat:@"abc"];
self.rStr = mStr;
self.cStr = mStr;
[mStr appendString:@"de"];
NSLog(@"retainStr:%@", _rStr);
NSLog(@"copyStr:%@", _cStr);
}
结果:
使用retain的字串rStr的值:@"abcde",
而使用copy的字串cStr的值:@"abc",
所以,如果一般情况下,我们都不希望字串的值跟着mStr变化,所以我们一般用copy来设置string的属性。
如果希望字串的值跟着赋值的字串的值变化,可以使用strong,retain。
3 copy和strong:在复制NSSring的情况下,copy和strong的情况是一样的。只有在复制NSMutableString的时候,strong跟retain差不多,就像是mrc下的retain,copy就是深复制。
贴几个大神的实验代码:
NSString特性分析学习
知识点总结
iOS5 ARC学习笔记
Attention
NSLog(@"test = %@, a_adr = %p,a_pointer",a,a,&a);
哎_ c没学好,潜意识认识&a是a实例的地址,想想才发现是指向a的指针的地址!!!