美文网首页
iOS 中 NSURLConnection 提前释放的一个BUG

iOS 中 NSURLConnection 提前释放的一个BUG

作者: 天空中的球 | 来源:发表于2017-09-05 11:27 被阅读66次

    按理说 NSURLConnection 已经在 iOS 9.0 的时候被弃用了,但是我们的老代码中还是有它的,毕竟也是同时要支持 iOS 8.0 的,然而很凑巧,我们最近遇到了一个 BUG 就是关于它的。

    NSURLConnection  *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connection start];
    

    然后我们在 Fabric 中收到了 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 的错误, 具体的崩溃就是在 [connection start]这一行。

    EXC_BAD_ACCESS KERN_INVALID_ADDRESS

    于是我们加了一个判断:

    NSURLConnection  *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if (!connection) {
        return;
    }
    [connection start];
    

    然而还是依然出现这个问题,于是我试着 NSLog 直接打印下,发现这个问题又没了。。。

    NSURLConnection  *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    NSLog(@"connection == %@", connection);
    [connection start];
    

    然后经小伙伴的提醒,直接对 Connection Copy 下这样就好了

    NSURLConnection  *connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] copy];
    [connection start];
    
    为什么会这样呢?
    • NSURLConnection :initWithRequest 给出的是一个自动释放的对象, 此时对象等同于先自动释放了
    • 对象是否为 nil , 并不代表其是不是野指针
    • 而为什么 NSLog 下又没出问题了,可以这样理解的。在编译的时候,connection 的对象相当于获取了,被持有了,运行时 connection 的指针就还在的,就没问题的;
      而没有 NSLog 的情况下,等到编译完成时,connection 的对象自动释放了,没有其他的持有其对象时,等到运行的时候就相当于野指针了,然而就报这个错了。

    这个是 NSURLConnection 老的这个类之前遗留下的一个问题,之前貌似苹果还有专门文档说这个问题的,现在木有了,所以建议以后不要用这个 NSURLConnection, 毕竟苹果也是希望用 NSURLSession 替换的。同时对于老代码中的这个,可以适当加上一些持有的动作,避免出现这个问题。 当然对 NSURLConnection 这个问题,有其他好的解决方案欢迎告知啊!

    相关文章

      网友评论

          本文标题:iOS 中 NSURLConnection 提前释放的一个BUG

          本文链接:https://www.haomeiwen.com/subject/iulujxtx.html