@property 参数详解

来源:互联网 发布:mac找不到照片宗卷 编辑:程序博客网 时间:2024/05/22 12:50

@property和@synthesize总是配对使用的,功能是让编译器自动生成一个与数据成员相关的读写方法,类似与Java的setter/getter方法。

@property的参数有三种类型:

读写属性: (readwrite/readonly)
setter语意:(assign/retain/copy)

原子性: (atomicity/nonatomic)


读写属性: (readwrite/readonly)

读写属性即设置数据成员是可写还是只读,默认是readwrite,如果是readonly则相当于不生成setter方法。

    readwrite    setter和getter方法都生成,即可读也可写;

    readonly    只生成getter方法;

原子性: (atomicity/nonatomic)
原子性即设置数据成员是否可以多线程访问,默认nonatomic,这样性能更好。

setter语意:(assign/retain/copy)

(一)

    assign    基本数据类型和代理对象

    retain    对象

    copy    NSString对象

(二)

assign

@property(nonatomic,assign) NSString * name;

-(void) setName: (NSString *)newName

{

    name = newName;    

//    直接赋值,此时newName和name完全相同,地址都是0XAAAA ,内容为0X1111 ,即name只是newName的别名,对任何一个操作就等于对另一个操作。因此retainCount不需要增加.

}

-(NSString *)name

{

    return name;

}

retain

@property(nonatomic,retain) NSString * name;

-(void) setName: (NSString *)newName

{   

    if (name != newName) {

    [name release];           

    name = [newName retain];  

//    此时name的地址不再为0XAAAA,可能为0XAABB,但是内容依然为0X1111.相当于两个指针都指向了同一个内存地址。因此name和newName都可以管理’abc’所在的内存。因此 retainCount需要增加1.      

}

-(NSString *)name

{

    return name;

}

 copy

@property(nonatomic,copy) NSString * name;

-(void) setName: (NSString *)newName

{      

     if (name != newName) {

    [name release];

    name = [newName copy];

//    此时会在堆上重新开辟一段内存存放@’abc’,比如0X1122,内容为@’abc’,同时会在栈上为name分配空间,比如地址:0XAACC,内容为0X1122, 因此retainCount增加1供name来管理0X1122这段内存.

  }

}

-(NSString *)name

{

    return name;

}


总结

assign: 简单赋值,不更改索引计数,对基础数据类型(NSInteger)和C数据类型(int, float, double, char, bool等)
copy:先旧值release,再Copy出新的对象,retainCount为1

retain:进行release旧值再retain输入值(newName)

retain是指针拷贝,copy 是内容拷贝

注意

当类拥有mutable子类时,你应该使用copy,而不是retain。例如:NSAArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString