ARC小解(二)
2015-09-27 18:08
253 查看
引用对象关键字
ARC中关于对象的引用参照,主要有下面几关键字。使用strong, weak, autoreleasing限定的变量会被隐式初始化为nil。
__strong
变量声明缺省都带有__strong关键字,如果变量什么关键字都不写,那么缺省就是强参照。
__weak
上面已经看到了,这是弱参照的关键字。由于该类型不影响对象的生命周期,所以如果对象之前就没有持有者,那么会出现刚创建就被破弃的问题
如果编译设定OS版本 Deployment Target 设定为这比这低的版本,那么编译时将报错(The current deployment target does not support automated __weak references),这个时候,我们可以使用下面的__unsafe_unretained。
弱参照还有一个特征,即当参数对象失去所有者之后,变量会被自动付上nil (Zeroing)。
__unsafe_unretained
该关键字与__weak一样,也是弱参照,与__weak的区别只是是否执行nil赋值(Zeroing)。但是这样,需要注意变量所指的对象已经被破弃了,地址还还存在,但内存中对象已经没有了。如果还是访问该对象,将引起「BAD_ACCESS」错误。
__autoreleasing
该关键字使对像延迟释放。比如你想传一个未初始化的对像引用到一个方法当中,在此方法中实例化此对像,那么这种情况可以使用__autoreleasing。他被经常用于函数有值参数返回时的处理,比如下面的例子。
又如函数的返回值是在函数中申请的,那么希望释放是在调用端时,往往有下面的代码。
即当方法的参数是id*,且希望方法返回时对象被autoreleased,那么使用该关键字。
ARC中关于对象的引用参照,主要有下面几关键字。使用strong, weak, autoreleasing限定的变量会被隐式初始化为nil。
__strong
变量声明缺省都带有__strong关键字,如果变量什么关键字都不写,那么缺省就是强参照。
__weak
上面已经看到了,这是弱参照的关键字。由于该类型不影响对象的生命周期,所以如果对象之前就没有持有者,那么会出现刚创建就被破弃的问题
// // main.m // OCStudy // // Created by LiuMingchuan on 15/9/24. // Copyright © 2015年 LMC. All rights reserved. // #import <Foundation/Foundation.h> #import "LMC.h" int main(int argc, const char * argv[]) { @autoreleasepool { __weak NSString *name4 = [[NSString alloc]initWithFormat:@"name4:%@",@"name4"]; NSLog(@"name4:%@",name4); } return 0; }输出:
2015-09-27 19:01:43.034 OCStudy[7771:6835906] name4:(null)
如果编译设定OS版本 Deployment Target 设定为这比这低的版本,那么编译时将报错(The current deployment target does not support automated __weak references),这个时候,我们可以使用下面的__unsafe_unretained。
弱参照还有一个特征,即当参数对象失去所有者之后,变量会被自动付上nil (Zeroing)。
__unsafe_unretained
该关键字与__weak一样,也是弱参照,与__weak的区别只是是否执行nil赋值(Zeroing)。但是这样,需要注意变量所指的对象已经被破弃了,地址还还存在,但内存中对象已经没有了。如果还是访问该对象,将引起「BAD_ACCESS」错误。
__autoreleasing
该关键字使对像延迟释放。比如你想传一个未初始化的对像引用到一个方法当中,在此方法中实例化此对像,那么这种情况可以使用__autoreleasing。他被经常用于函数有值参数返回时的处理,比如下面的例子。
- (void) generateErrorInVariable:(__autoreleasing NSError **)paramError { .... *paramError = [[NSError alloc] initWithDomain:@"MyApp" code:1 userInfo:errorDictionary]; } .... { NSError *error = nil; [self generateErrorInVariable:&error]; NSLog(@"Error = %@", error); }
又如函数的返回值是在函数中申请的,那么希望释放是在调用端时,往往有下面的代码。
-(NSString *)stringTest { NSString *retStr = [NSString stringWithString:@"test"]; return [[retStr retain] autorelease]; } // 使用ARC -(NSString *)stringTest { __autoreleasing NSString *retStr = [NSString alloc] initWithString:@"test"]; return retStr; }
即当方法的参数是id*,且希望方法返回时对象被autoreleased,那么使用该关键字。
相关文章推荐
- opencv7-ml之KNN
- hdu5491 The Next(合肥网赛)
- opencv7-ml之KNN
- visual studio 静态库项目
- PHP数组 与 JSON 互相转换 (json_encode和json_decode的使用)
- POJ 3624 Charm Bracelet 【0 1背包】
- STL 清除模板容器 clear.h
- Java 大数值
- [ruby][文件操作]对当前文件夹下的文件进行重命名
- 顺序表(ArrayList)java实现
- epoll简介(二)
- JavaScript高级程序设计之面向对象的程序设计之继承之原型链 第6.3.1讲笔记
- 封装的概念和原理,set和get方法
- Maven-配置链接到私服及设置本地仓库
- 浅谈关于Java的注解使用
- 读懂程序里的--时间
- 逻辑和情绪
- OpenStack OVS GRE/VXLAN网络
- Java Web开发1___JSP指令元素:taglib指令
- HDU 5486 Difference of Clustering 图论