@property总结

来源:互联网 发布:vnr更新数据库失败 编辑:程序博客网 时间:2024/05/15 17:45

参考网址:

http://blog.csdn.net/dfqin/article/details/11669993
http://www.linuxidc.com/Linux/2014-03/97744.htm
http://www.cnblogs.com/andyque/archive/2011/08/03/2125728.html
http://blog.csdn.net/dfqin/article/details/11669993
http://www.linuxidc.com/Linux/2014-03/97744.htm

属性是一种支持访问对象成员变量的快捷方法,并且允许我们使用点语法。@property是给编译器看的一种指令,它可以在编译之后为我们生成相应的getter和setter方法。不仅如此,@property还可以帮助我们做内存管理。另外,使用@property 就不用单独声明实例变量,因为在没有显示提供实例变量声明的前提下,系统会自动帮助我们生成实例变量。
@property中的关键字可以分为三类:分别是:原子性,存取器控制,内存管理

原子性:

atomic: 表明操作是原子的意味着只有一个线程访问实例变量,atomic是线程安全的,至少在当前存取器上是安全的,它是一个默认特性,但是很少使用,因为比较影响效率

nonatomic:表示非原子的,可以被多个线程访问,它的效率比atomic快,但是不能保证在多线程环境下的安全性,在单线程和名犬只有一个线程访问的情况下广泛使用。

存取器控制

readwrite(默认):readwrite是默认值,表示该属性同时拥有setter和getter
readonly:readonly表示只有getter没有setter、

内存管理:

assign(默认)assign用于值类型,如 int,float,double,NSInterger,CGFloat等表示单纯的复制,还包括不存在所有权关系的对象,比如常见的delegate
retain:在setter方法中,需要对传入对象的引用计数+1,简单来说就是对于传入的对象拥有所有权,只要对该对象有所有权,该对象就不会被释放
strong:strong是IOS在引入ARC的时候引入的关键字,是retain的一个代替品,表示实例变量对传入的对象要有所有权关系,即强引用,strong,跟retain的意思是相同的并且产生相同的代码,但是在语义上能够更好的体现对象之间的关系
weak:在setter方法中,需要对传入的对象不进行引用计数+1简单来说,就是对于传入的对象没有所有权。当该对象引用计数为0的时候,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0。delegate和outlet一般用weak来声明。
copy:与strong类似,但是区别在于实例变量是对传入对象的副本拥有所有权,而不是对象本身

atomic是默认行为,assign是默认行为。一般来说NSString类型的用copy,delegate用assign,非objc数据类型,比如int,float等基本数据类型用assign,而其他的objc类型,例如NSDate,等用strong。
如果我们自己实现了相应的getter和setter那么编译器就会使用我们自己定义的存取器,否则,编译器会根据atomic/nonatomic/retian/assign/copy.这其中我们指定的部分规则去生成相应的getter和setter。
1 0