一般都是多线程造成的,某一个线程在操作一个对象时,另一个线程将此对象释放,此时就有可能造成野指针的问题。一种解决办法是如果都是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];

}

 

}

posted on 2018-11-07 15:21  ximenchuixie  阅读(461)  评论(0编辑  收藏  举报