您的位置:首页 > 运维架构

@property中的关键字说明

2016-04-27 13:05 316 查看

前言

以前读书看到@property理解都不深刻,只是简单的认为帮我们做了setter和getter。对其中的几个关键字理解都不到位,今天被坑了,故来标记一下。

关键字

atomic

线程保护的,默认。意思是在多线程编程中,对该属性的访问具有原子性,不会被cpu时间片切分。


nonatomic

线程不保护的,相反。atomic机制是耗费系统资源的,所以在资源不充裕的设备上,如果没有使用多线程间的通讯编程,那么选择nonatomic就比较好。


assign

直接赋值,不更改引用计数,默认。常用语基础数据类型(NSInteger,CGFloat)和c数据类型(int ,char ,float...)


retain

保留对象,内部会自动调用retain方法,引用计数+1。常用于NSObject及其之类。


copy

建立一个引用计数为1的新对象,并释放旧对象。常用于NSString。


举例说明assign和retain:

@property (nonatomic, retain) NSString *str1;
@property (nonatomic, retain) NSString *str2;

self.str1 = @"String 1";
self.str2 = self.str1;
self.str1 = nil;
NSLog(@"String 2 = %@", self.str1);


输出结果是String 2 = String 1,由于str是retain定义的属性,所以引用计数加1。str1和str2都会指向@"String 1"。当str1指向nil时,
并不会影响str2指针指向@"String 1"。


@property (nonatomic, retain) NSString *str1;
@property (nonatomic, assign) NSString *str2;

self.str1 = @"String 1";
self.str2 = self.str1;
self.str1 = nil;
NSLog(@"String 2 = %@", self.str1);


此时输出的结果是,String 2 = null,原因是str2是assign定义的属性,直接赋值,没有retain内存地址.当Str1释放了内存,str2也变为了nil。


readwrite

生成get/set方法,默认。


readonly

只生成get方法。


strong

strong同retain作用一样。strong和weak是由ARC引入的对象变量属性,其作用类似于retain和assign。在xcode4.3及以后,自动创建的属性,
都是默认用strong和weak,而不是assign和retain。


weak

同assign一样。


unsafe_unretained

unsafe_unretained 就是ios5版本以下的 assign ,也就是 unsafe_unretained , weak, assign 三个都是一个样的。
因为 ios5用的是 weak ,那在ios4.3就用不了,如果你将 weak 修改为 unsafe_unretained ,那就可以用了。
说到底就是iOS 5之前的系统用该属性代替 weak 来使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: