一般都是多线程造成的,某一个线程在操作一个对象时,另一个线程将此对象释放,此时就有可能造成野指针的问题。一种解决办法是如果都是UI操作则将这些操作都放在主线程去执行。

通常出现此问题的地方都在RAC,或者某些异步执行的block中。

以下这种情况也会产生野指针,即EXC_BAD_ACCESS错误,也就是访问了一个已经被释放的对象。

__autoreleasing UIView* myView;

@autoreleasepool {

myView = [UIView new];

NSLog(@"inside autoreleasepool myView:%@", myView);

}

NSLog(@"outside autoreleasepool myView:%@", myView);

同理:

-viewDidLoad {

NSError *error; //尽管这里默认是strong,但是downloadUrl函数里给error赋值的时候会根据函数的形参的修饰符来去决定是__strong还是__autorelease

[self downloadUrl:@“http://xxx.png” &error];

NSLog(@“error:%@”, error); //crash,EXC_BAD_ACCESS

}

-(void)downloadUrl:(NSString*)url error:(NSError**)error {//这里的NSError*默认是autorelease的,相当于(NSError * __autorelease *)error, 要解决这个问题可以强制把它变成strong的,如(NSError* __strong*)error

@autorelease {

*error = [[NSError alloc] init];

}

}

04-24 14:53