ARC小解(二)
来源:互联网 发布:超人软件倒闭 编辑:程序博客网 时间:2024/05/22 11:54
引用对象关键字
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,那么使用该关键字。
0 0
- ARC小解(二)
- ARC小解(一)
- ARC小解(三)
- protocol小解(二)
- 算法小解--剑指offer(二)
- ios arc (二)关于 ARC
- ARC使用心得(二)
- ARC使用心得(二)
- ARC使用心得(二)
- ARC使用心得(二)
- ARC(二) ARC规则
- 缓存机制 Cache ARC算法(二)
- protocol小解(一)
- ARC(二):ARC之@property使用
- ios 非arc转arc 之二
- C++ 类名()小解
- ARC 学习笔记(二)-Outlet与弱引用
- ARC内存管理及强弱指针(二)
- CSS命名规范
- 网站智能客服--图灵机器人接入方式
- 面试步步受挫,在打击中成长
- jQuery 关于时间的相互转化
- 实现文件上传和下载完整案例
- ARC小解(二)
- 使用递归和非递归方式反转单向链表
- Javascript--函数技巧
- 欢迎使用CSDN-markdown编辑器
- Android SDK Manager 更新代理
- poj 1942 paths on a grid
- 关于"树(Tree, UVa548)“的记录
- Elasticsearch实现与mysql的数据库的同步
- 深入javascript-继承机制