@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 来使用。
相关文章推荐
- 在Linux直接运行安卓程序
- 最近的两个小项目,2:Python webapp的docker镜像
- Linux下svn服务端的安装与配置
- 【实战】Docker Machine + Compose + Swarm
- 给一个正在运行的Docker容器动态添加Volume
- top命令的用法
- Nginx+tomcat+session共享
- Linux防火墙的设置
- linux 进程通信 :流套接字
- Linux下查各子目录占磁盘大小
- ( Linux)将CrossOver的wine程序移植到PlayOnLinux
- maven scope含义的说明
- OpenCV3如何使用SIFT和SURF Where did SIFT and SURF go in OpenCV 3?
- maven scope含义的说明
- nginx引入rewrite文件
- ecshop支付时减库存方法
- Linux内存文件系统
- nginx的conf文件的详细配置
- Linux下获取当前进程ID、进程名、进程路径
- linux 私房菜学习笔记点——用户组,文件夹权限系列