先看下面一个例子
#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]; } } @end int 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; } } @end int 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; }
Objc中2维指针作为输出参数时由ARC及@autoreleasepool引发的血案
时间: 2024-10-07 02:03:26