一般来说,通过函数(非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;

posted on 2020-06-29 09:31  ximenchuixie  阅读(174)  评论(0编辑  收藏  举报