您的位置:首页 > 其它

ARC小解(二)

2015-09-27 18:08 253 查看
引用对象关键字

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,那么使用该关键字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: