Objective-C @property学习总结3 完结

来源:互联网 发布:程序员专业术语 编辑:程序博客网 时间:2024/05/09 20:28

attribute有如下几种取值,各个attribute的含义涉及到Objective-C中内存管理的相关知识,所以这里只是简单的介绍

  • 读写属性: (readwrite/readonly) 决定是否生成set访问器
  • setter语意  (assign/retain/copy)set访问器的语义,决定以何种方式对数据成员赋予新值。
  • 原子性:    (atomic/nonatomic)

readwrite: 系统会生成setter/getter方法 

readonly: 系统只生成getter方法.

此标记说明属性是只读的,如果你指定了readonly,在@implementation中只需要一个getter。或者如果你使用@synthesize关键字,也只会生成getter方法。如果你试图为属性赋值,你将得到一个编译错误。readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。

assign: 简单赋值,不更改索引计数

此标记说明设置器直接进行赋值,这也是默认值。在使用ARC的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

retain: 释放旧的对象,将旧对象的值赋予输入对象,再增加输入对象的索引计数为1

指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数)。

copy: 建立一个索引计数为1的对象,然后释放旧对象

它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。

atomic/nonatomic:

指出访问器不是原子操作,atomic表示属性是原子的,支持多线程并发访问,而默认地nonatomic,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。没有特别的多线程要求建议用 nonatomic 有助于提高性能。

在iOS5引入了自动引用计算(ARC)之后,对象变量属性新增了strong和weak,strong与retain作用类似,可以说是用来代替retain。


0 0
原创粉丝点击