首页 > 代码库 > Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案

Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案

先看下面一个例子

#import <UIKit/UIKit.h>#import "AppDelegate.h"@interface Something : NSObject- (void)doWithError:(NSError **)outError;@end@implementation Something- (void)doWithError:(NSError **)outError{    @autoreleasepool    {        *outError = [NSError errorWithDomain:@"Emergency" code:999 userInfo:nil];    }}@endint main(int argc, const char *argv[]){    @autoreleasepool    {        NSError *error = nil;
     // Sometimes EXC_BAD_ACCESS when return from this method. [[[Something alloc] init] doWithError:&error]; // At this point, the main thread gives EXC_BAD_ACCESS. NSLog(@"%@", error); } return 0;}

 在NSLog输出的时候会EXC_Bad_ACCESS

  

正确写法应该是这样:

 

@interface Something : NSObject- (void)doWithError:(NSError **)outError;@end@implementation Something- (void)doWithError:(NSError **)outError{    NSError *error = nil;    @autoreleasepool    {        error = [NSError errorWithDomain:@"Emergency" code:999 userInfo:nil];        // Do something    }    if(error)    {        *outError = error;    }}@endint main(int argc, char * argv[]){    @autoreleasepool    {        NSError *__autoreleasing error = nil;                [[[Something alloc] init] doWithError:&error];                // At this point, the main thread gives EXC_BAD_ACCESS.        NSLog(@"%@", error);                int a = 1;        ++a;    }    return 0;}