【OC】@property的特性
2016-07-15 14:16
239 查看
@property还有一些关键字,它们都是有特殊作用的
我把它们分为三类,分别是:原子性,存取器控制,内存管理
1. 原子性
atomic(默认):atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,但是很少使用,因为比较影响效率,这跟ARM平台和内部锁机制有关。
nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。
2. 存取器控制
readwrite(默认):readwrite是默认值,表示该属性同时拥有setter和getter。
readonly: readonly表示只有getter没有setter。
有时候为了语意更明确可能需要自定义访问器的名字:
最常见的是BOOL类型,比如标识View是否隐藏的属性hidden。可以这样声明:
3. 内存管理
@property有显示的内存管理策略。这使得我们只需要看一眼@property声明就明白它会怎样对待传入的值。
assign(默认):assign用于值类型,如int、float、double和NSInteger,CGFloat等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。
以上两段代码是相同的。
在setter方法中,采用直接赋值来实现设值操作:
retian:在setter方法中,需要对传入的对象进行引用计数加1的操作。
简单来说,就是对传入的对象拥有所有权,只要对该对象拥有所有权,该对象就不会被释放。如下代码所示:
strong:strong是在IOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有所有权关系,即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。
weak:在setter方法中,需要对传入的对象不进行引用计数加1的操作。
简单来说,就是对传入的对象没有所有权,当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0。
注:weak关键字是IOS5引入的,IOS5之前是不能使用该关键字的。delegate 和 Outlet 一般用weak来声明。
copy:与strong类似,但区别在于实例变量是对传入对象的副本拥有所有权,而非对象本身。
我把它们分为三类,分别是:原子性,存取器控制,内存管理
1. 原子性
atomic(默认):atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,但是很少使用,因为比较影响效率,这跟ARM平台和内部锁机制有关。
nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。
2. 存取器控制
readwrite(默认):readwrite是默认值,表示该属性同时拥有setter和getter。
readonly: readonly表示只有getter没有setter。
有时候为了语意更明确可能需要自定义访问器的名字:
@property有显示的内存管理策略。这使得我们只需要看一眼@property声明就明白它会怎样对待传入的值。
assign(默认):assign用于值类型,如int、float、double和NSInteger,CGFloat等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。
在setter方法中,采用直接赋值来实现设值操作:
简单来说,就是对传入的对象拥有所有权,只要对该对象拥有所有权,该对象就不会被释放。如下代码所示:
weak:在setter方法中,需要对传入的对象不进行引用计数加1的操作。
简单来说,就是对传入的对象没有所有权,当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0。
注:weak关键字是IOS5引入的,IOS5之前是不能使用该关键字的。delegate 和 Outlet 一般用weak来声明。
copy:与strong类似,但区别在于实例变量是对传入对象的副本拥有所有权,而非对象本身。
相关文章推荐
- Linux kernel -- Uevent发送(热插拔)事件到用户空间
- shell
- WebLogic、WebSphere、JBOSS、Tomcat之间的区别
- centos入门的一些笔记
- linux下开启mysql慢查询,分析查询语句
- Hadoop集群完全分布式模式环境部署和管理的5大工具
- Centos系统下Lamp环境的快速搭建(超详细)
- apache下用expires_module让浏览器缓存静态文件
- mac Tomcat安装
- JAVA-错误Several ports (8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.
- 关闭SELINUX
- Linux下使用rsync同步文件
- Linux下Rsync+sersync实现数据实时同步
- linux core设置
- linux下通过rsync+inotify 实现数据实时备份(远程容灾备份系统)
- Tomcat运行startup一闪而过
- 让Codeigniter支持HMVC架构
- Linux 开机启动方式设置 inittab 详解,开机直接进入“命令行”模式
- Linux 定时任务 Crontab命令 详解
- Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)