iOS学习笔记(4)@property和类型之间用括号添加一些额外的指示符的作用
2014-05-23 16:34
281 查看
当使用@property定义property时,还可在@property和类型之间用括号添加一些额外的提示符,可使用的特殊指示符如下
· assign:该指示符指定对属性只是进行简单赋值,不更改对所赋的值的引用计数。这个指示符主要适用于NSInteger等基础类型,以及short、float、double、结构体等各种C数据类型。
提示:引用计数是Objective-C内存回收的概念,当一个对象的引用计数大于0时,表明该对象还不应该被回收,由于NSInteger等基础类型,以及short、float、double、结构体等各种C数据类型都不存在回收的问题,因此使用assign即可。
· atomic(nonatomic):指定合成的存取方法是否为原子操作。所谓原子操作,主要指是否线程安全。如果使用atomic,那么合成的存、取方法都是线程安全的——当一个线程进入存、取方法的方法体之后,其他线程无法进入该存、取方法,这样就可以避免多线程并发破坏对象数据完整性,atomic是默认值。虽然atomic可以保证对象数据的完整性,但atomic的线程安全会造成性能下降,因此,大多数单线程环境下,我们都会考虑使用nonatomic来提高存取方法的访问性能。
· copy:如果使用copy指示符,当调用setter方法对成员变量赋值时,会将被赋值的对象复制一份副本,再将该副本赋值给成员变量。copy指示符会将原成员变量所引用对象的引用计数减1。当成员变量的类型是可变类型,或其子类是可变类型时,被赋值的对象有可能在赋值之后被修改,如果程序不需要这种修改影响setter方法设置的成员变量的值,此时就可考虑使用copy指示符。
· getter、setter:这两个指示符用于为合成的getter方法、setter方法指定自定义方法名。例如,getter=abc指定getter方法的方法名为abc;setter=xyz: (因此setter方法要带参数,不要忘记了冒号),则指定setter方法的方法名为xyz:。
· readonly、readwrite:readonly指示系统只合成getter方法,不再合成setter方法;readwrites是默认值,指示系统需要合成setter、getter方法。
· retain:使用retain指示符定义属性时,当把某个属性赋值给该属性时,该属性原来所引用的对象的引用计数减1,被赋值对象的引用计数加1。
提示:在未启用ARC机制的情况下,retain是一个很有用的指示符:当一个对象的引用计数大于1时,该对象不应该被回收,但启用ARC机制之后,一般较少使用retain指示符。
· strong、weak:strong指示符指定该属性对被赋值对象持有强引用,而weak指示符指定该属性对被赋值对象持有弱引用。强引用的意思是:只要该强引用指 向被赋值的对象,那么该对象就不会自动回收;弱引用的意思是:即使该弱引用指向被赋值的对象,该对象也可能被回收。
提示:在启动ARC机制时,使用strong、weak指示符将十分方便。如果程序不希望被该属性引用的对象被回收,那就应该使用strong指示符;如果程序需要保证性能,避免内存溢出,则可以使用weak指示符。使用weak指示符时需要小心,当程序通过该weak属性来访问被引用的对象时,该对象可能已经被回收了。对于声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样能有效地防止悬空指针。weak指示符可有效地帮我们防止悬空指针。
· unsafe_unretained:这个指示符与weak指示符基本相似,对于只被unsafe_unretained指针所指向的对象,该对象也可能被回收。与weak指针不同的是,当unsafe_unretained指针所引用的对象被回收后,unsafe_unretained指针不会被赋值为nil,因此这可能导致程序崩溃。一般来说,使用unsafe_unretained指示符不如使用weak指示符。
· assign:该指示符指定对属性只是进行简单赋值,不更改对所赋的值的引用计数。这个指示符主要适用于NSInteger等基础类型,以及short、float、double、结构体等各种C数据类型。
提示:引用计数是Objective-C内存回收的概念,当一个对象的引用计数大于0时,表明该对象还不应该被回收,由于NSInteger等基础类型,以及short、float、double、结构体等各种C数据类型都不存在回收的问题,因此使用assign即可。
· atomic(nonatomic):指定合成的存取方法是否为原子操作。所谓原子操作,主要指是否线程安全。如果使用atomic,那么合成的存、取方法都是线程安全的——当一个线程进入存、取方法的方法体之后,其他线程无法进入该存、取方法,这样就可以避免多线程并发破坏对象数据完整性,atomic是默认值。虽然atomic可以保证对象数据的完整性,但atomic的线程安全会造成性能下降,因此,大多数单线程环境下,我们都会考虑使用nonatomic来提高存取方法的访问性能。
· copy:如果使用copy指示符,当调用setter方法对成员变量赋值时,会将被赋值的对象复制一份副本,再将该副本赋值给成员变量。copy指示符会将原成员变量所引用对象的引用计数减1。当成员变量的类型是可变类型,或其子类是可变类型时,被赋值的对象有可能在赋值之后被修改,如果程序不需要这种修改影响setter方法设置的成员变量的值,此时就可考虑使用copy指示符。
· getter、setter:这两个指示符用于为合成的getter方法、setter方法指定自定义方法名。例如,getter=abc指定getter方法的方法名为abc;setter=xyz: (因此setter方法要带参数,不要忘记了冒号),则指定setter方法的方法名为xyz:。
· readonly、readwrite:readonly指示系统只合成getter方法,不再合成setter方法;readwrites是默认值,指示系统需要合成setter、getter方法。
· retain:使用retain指示符定义属性时,当把某个属性赋值给该属性时,该属性原来所引用的对象的引用计数减1,被赋值对象的引用计数加1。
提示:在未启用ARC机制的情况下,retain是一个很有用的指示符:当一个对象的引用计数大于1时,该对象不应该被回收,但启用ARC机制之后,一般较少使用retain指示符。
· strong、weak:strong指示符指定该属性对被赋值对象持有强引用,而weak指示符指定该属性对被赋值对象持有弱引用。强引用的意思是:只要该强引用指 向被赋值的对象,那么该对象就不会自动回收;弱引用的意思是:即使该弱引用指向被赋值的对象,该对象也可能被回收。
提示:在启动ARC机制时,使用strong、weak指示符将十分方便。如果程序不希望被该属性引用的对象被回收,那就应该使用strong指示符;如果程序需要保证性能,避免内存溢出,则可以使用weak指示符。使用weak指示符时需要小心,当程序通过该weak属性来访问被引用的对象时,该对象可能已经被回收了。对于声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样能有效地防止悬空指针。weak指示符可有效地帮我们防止悬空指针。
· unsafe_unretained:这个指示符与weak指示符基本相似,对于只被unsafe_unretained指针所指向的对象,该对象也可能被回收。与weak指针不同的是,当unsafe_unretained指针所引用的对象被回收后,unsafe_unretained指针不会被赋值为nil,因此这可能导致程序崩溃。一般来说,使用unsafe_unretained指示符不如使用weak指示符。
相关文章推荐
- IOS学习笔记——一些零碎知识
- IOS开发基础教程学习笔记4 在storyboard的场景之间传递数据
- ios开发学习笔记 两个窗体之间跳转
- ios 8 发布后的一个初探swift语言的学习笔记(基本数据类型)
- IOS学习笔记:视图之间传值的方法
- ios学习笔记(五)xcode4.3.2中添加Window-Based Application模版
- iOS开发学习笔记 2-2 C语言部分 类型、运算符与表达式
- ios开发学习笔记 两个窗体之间跳转
- Objective-C学习笔记--一些有用的数据类型
- iOS学习笔记之view之间连接错误
- 【学习笔记】关于变量类型的一些知识
- 第二章、Objective-C中的@property、@synthesize和dynamic的用法(iOS学习笔记,从零开始)
- IOS学习笔记10-UIView的一些基本方法理解:loadView、viewDidLoad、viewDidUnload、viewWillAppear、viewWillDisappear、
- C#学习笔记1-类型之间的转换 分享修改删除
- (ios开发学习笔记三)两个窗体之间跳转,实现多窗体
- 第三章、一些基本数据结构使用和解析(iOS学习笔记,从零开始。)
- iOS开发学习笔记 -- (二)动态添加控件和事件处理
- iOS: 学习笔记, 动态添加按钮
- [C#] 类型学习笔记二:详解对象之间的比较
- IOS学习笔记48--一些常见的IOS知识点+面试题