iOS 中 NSURLConnection 提前释放的一个BUG

按理说 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]这一行。

iOS 中 NSURLConnection 提前释放的一个BUG_第1张图片
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)