ARC下野指针 EXC_BAD_ACCESS错误

本文深入探讨了野指针问题及其引发的EXC_BAD_ACCESS错误,特别是在多线程环境下,当一个线程操作的对象被另一个线程释放时,如何避免野指针的产生。文章提供了实例代码,展示了在RAC和异步block中常见的错误用法,并提出了在主线程执行UI操作的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

 

}

转载于:https://www.cnblogs.com/yibinpan/p/9922726.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值