@property的参数

来源:互联网 发布:怎么更改淘宝密码修改 编辑:程序博客网 时间:2024/06/06 04:40

转载请标明出处:
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。

3 0
原创粉丝点击