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
原创粉丝点击