记录property中的所有属性特性
来源:互联网 发布:python 数据接口 编辑:程序博客网 时间:2024/06/15 07:20
刚开始学习ios的时候发现在头文件里面的变量都带有不同的属性,当时也没太在意他们的区别,但是心里始终都不踏实,所以专门写个博客把它们理解的同时也记录下来。
property作用
使用方法:
.h文件@property NSString * name;.m文件@synthesize name = _name;
表达意思:表示生成了一个对外变量名为name的setter和getter方法。
补充说明:在 ios5.0后,@synthesize也可以省略不写,此时在.h文件中只写@property即可,编译器会自动生成相应的实例变量,实例变量的名字是属性名称前加下划线。
所有特性
readyonly、readwrite、atomic、nonatomic、assign、retain、copy、strong、weak、unsafe_unretained
特性分类
- 读写性(readyonly、readwrite)
- 原子性(atomic 、nonatomic)
- 管理性(assign、retain、copy、strong、weak、unsafe_unretained)
属性注意事项
- strong、weak、unsafe_unretain这几个属性是在ARC推出后新加的
- ARC环境下,对象内存管理不再使用retain、release、autorelease
特性讲解
读写性
(1) readwrite
描述:该类的默认属性,从字面能理解同时具有读/写操作,从代码上理解就是具有setter和getter。
(2) readyonly
描述:从字面能理解只具有读的操作,从代码上理解就是只有getter没有setter。
原子性
(1) atomic
描述:该类的默认属性,能保证多线程访问下的安全,但浪费系统资源,同时系统会为setter方法加锁。注意一点的是:atomic并不代表真正的线程安全。
(2) nonatomic
描述:非原子性访问,不同步,而且可以同时被多个线程访问。nonatomic效率相对较高,一般情况下都使用这个。
管理性
(1) assign
对象:该类的默认属性(ARC之前),主要面向基础数据类型(int,float,double等),以及基础数据的封装类NSInteger等。
原理:setter方法直接赋值,而不进行retain操作,对对象类型不会发生引用计数变化。
(2) retain
对象:除NSString以外其他NSObject和其子类
原理:setter方法对参数进行release旧值,再retain新值。Retain是指针复制(浅复制),引用计数加1,而不会导致内容被复制。
(3) copy
对象:NSString
原理:setter方法对参数进行release旧值,再Copy出新的对象,新对象的引用计数为1。Copy是复制内容(深复制),如果调用copy的是数组,则为指针复制(浅复制),仅仅复制子元素的指针。
(4) strong
对象:该类的默认属性(ARC之后)
原理:strong与retain类似,引用计数会自动+1。
(5) weak
对象:delegate比较常见,以防止循环引用。
原理:weak与assign类似,唯一区别是weak对象会销毁后自动设置为nil,而assign不会。声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针。
(6) unsafe_unretained
对象:比较少的使用
原理:从它的名字拆分来说,先是unretained代表与weak、assign类似,然后是unsafe,直接在代码里试了一下。当所指向的值被置空后,再使用unsafe_unretained类型的值将会闪退。原因是因为它与weak不同的地方是,当对象被释放后,不会被赋值为nil,所以导致闪退了。
临时变量的声明
对于变量来说也是可以添加对应的声明,具体的特性有:__strong、 __weak、 __unsafe_unretained、 __autoreleasing。
这四个特性前三个与前面介绍strong、weak、unsafe_unretained具有同样的功能。
(4) __autoreleasing
描述:说到__autoreleasing,可能大家会有个疑虑:与MRC时代的autorelease是否有关系。首先因为在ARC里面是不允许使用autorelease的,要记住这点,然后对于 __autoreleasing是针对变量使用的,官方的解释是适用于引用参数的传递当中( __autoreleasing is used to denote arguments that are passed by reference (id *) and are autoreleased on return.)
比较:下面两段代码目的是一样的
//在MRC中NSString *str = [[[NSString alloc] initWithFormat:@"but"] autorelease]; //在ARC中NSString *__autoreleasing str = [[NSString alloc] initWithFormat:@"but"];
讲解:error的使用
(1)一般用法
NSError *error;BOOL OK = [myObject performOperationWithError:&error];if (!OK) { // Report the error. // ...
(2)函数的命名格式
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;
(3)编译器的运行
NSError * __strong error;//自动添加NSError * __autoreleasing tmp = error;BOOL OK = [myObject performOperationWithError:&tmp];//自动添加error = tmp;if (!OK) { // Report the error. // ...
(4)正确用法
NSError *__autoreleasing error;BOOL OK = [myObject performOperationWithError:&error];if (!OK) { // Report the error. // ...
(5)优点
__autoreleasing形式创建出来的error对象,会被放入到autoreleasing pool中,等函数执行完毕就会把对象自动释放,而函数外error的使用者则不需要担心error对象被释放的问题。
- 记录property中的所有属性特性
- OC中的属性特性(Property)
- Delphi 中的属性property
- VB中的属性 Property
- Python 中的 property 属性
- Python 中的 property 属性
- property中的copy属性
- Python 中的 property 属性
- Object-C中的特性-----property
- C# 字段(Field)、属性(Property)、特性(Attribute)
- 【Objective-C】@property的所有属性详解
- OC中@property的所有属性详解
- OC中@property的所有属性
- OC中@property的所有属性详解
- 类/类别中的property属性
- @property括号中的属性声明
- iOS中的@property的属性
- 浅谈Python中的 property属性
- KVO
- 如何在十天内掌握线性代数?
- 黑马程序员----JAVA基础语法
- maven之javamail操作qq的smtp与imap
- EmguCV在C#中的应用
- 记录property中的所有属性特性
- 2015061201 - 马王堆汉墓(上)
- 单元测试系列之1:开发测试的那些事儿
- C++常成员函数 - const 关键字
- 好玩的WPF第三弹:颤抖吧,地球!消失吧,地球!
- iOS学习笔记
- 栈学习之括号匹配
- Leetcode[110]-Balanced Binary Tree
- BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的