引用对象关键字
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,那么使用该关键字。
本文深入解析 Objective-C 中弱引用(__weak) 和自动释放(__autoreleasing) 的使用场景与特性,包括如何避免内存泄漏及正确处理对象生命周期。
962

被折叠的 条评论
为什么被折叠?



