标签:
转载请标明出处:
http://blog.csdn.net/xmxkf/article/details/51353580
本文出自:【openXu的博客】
参数类别 | 参数 | 说明 |
---|---|---|
原子性 | atomic | 对属性加锁,多线程下线程安全,默认值 |
nonatomic | 对属性不加锁,多线程下不安全,但速度快 | |
读写属性 | readwrite | 生成getter、setter方法,默认值 |
readonly | 只生成getter方法 | |
set方法处理 | assign | 直接赋值,默认值 |
retain | 先release原来的值,再retain新值(包括判断是否为同一个值) | |
copy | 先release原来的值,再copy新值(包括判断是否为同一个值) |
copy拷贝(复制)分类:
①、深拷贝(深复制):内容拷贝,会产生新对象
②、浅拷贝(浅复制):指针拷贝,不会产生新对象
至于copy某个对象是深拷贝还是浅拷贝,只需要遵循下面两个原则,然后推测即可。
copy语法的两个原则:
①、新指针和旧指针指向对象的内容要一样
②、修改新指针指向的对象不会影响旧指针指向的对象
修改旧指针指向的对象不会影响新指针指向的对象
比如:
#pragma mark NSString的mutableCopy 深拷贝
void stringMutableCopy(){
// 不可变的字符串
NSString *old = [[NSString alloc] initWithFormat:@"Jack"];
// 拷贝产生了一个可变的字符串,为了修改新指针指向的对象不会影响旧指针指向的对象,所以必须生成一个新的对象(深拷贝)
NSMutableString *new = [old mutableCopy];
[new appendString:@" 1234"];
NSLog(@"old=%@", old);
NSLog(@"new=%@", new);
[new release];
[old release];
}
#pragma mark NSString的copy 浅拷贝(新旧指针指向的字符串都不能改变,所以没必要生成新的对象)
void stringCopy(){
//不可变字符串
NSString *old = [[NSString alloc] initWithFormat:@"Jack"];
// 在这种情况(返回对象本身)下,相当于retain
NSString *new = [old copy];
NSLog(@"new-%d", [new retainCount]);
NSLog(@"old-%d", [old retainCount]);
NSLog(@"old=%p", old);
NSLog(@"new=%p", new);
NSLog(@"old=%@", old);
NSLog(@"new=%@", new);
//[old release];
[new release];
[old release];
}
在非ARC的情况下:
①、copy:release旧值,copy新值
②、assign:直接赋值
③、retain:release旧值,retain新值
在ARC的情况下:
①、copy:release旧值,copy新值
②、assign:用在基本数据类型上
③、strong:强引用,类似于retain
③、weak:类似于assign(用在对象身上)
使用retain
后生成的set
方法如下:
- (void)setName:(NSString *)name{
if (_name != name)
{
[_name release];
_name = [name copy];
}
}
使用copy
后生成的set
方法如下:
- (void)setName:(NSString *)name{
if (_name != name)
{
[_name release];
_name = [name copy];
}
}
总结:基本数据类型用assign,NSString用copy,ARC下如果需要得到对象的引用(引用计数器+1,宿主在,对象就不会被销毁)用strong,如果不需要则用weak。
标签:
原文地址:http://blog.csdn.net/xmxkf/article/details/51353580