一般来说,通过函数(非alloc new copy mutableCopy开头的)返回值返回的或者指针的指针返回的对象都是autorelease对象。(二级指针默认都是autorelease对象)
所以看一个常见的代码(ARC下):
NSError *error;
[self handeSomething:@"abc" error:&error];
-(void)handSomething:(NSString*)str error:(NSError**)error {
*error = [[NSError alloc] init];
}
这段代码编译后是这样的:
NSError * __strong error;
NSError * __autoreleasing temp;
[self handleSomething:@"abc" error:&temp];
error = temp;
-(void)handleSomething:(NSString*)str error:(NSError* __autoreleasing *)error {
*error = [[NSError alloc] init];
}
进一步转成MRC:
NSError * error;
NSError * temp;
[self handleSomething:@"abc" error:&temp];
error = [temp retain];
-(void)handleSomething:(NSString*)str error:(NSError* *)error {
*error = [[[NSError alloc] init] autorelease];
}
注意:
二级指针进行赋值时,对象的所有权修饰符必修保持一致,如:
NSError *error = nil;
NSError **temp = &error;
这样写编译器会报错,因为&error默认是 NSError*__strong* 类型,而temp默认是NSError*__autoreleasing * 类型,所以如果不报错需要改成:
NSError *error = nil;
NSError *__strong*temp = &error;