按理說(shuō) NSURLConnection 已經(jīng)在 iOS 9.0 的時(shí)候被棄用了,但是我們的老代碼中還是有它的写烤,畢竟也是同時(shí)要支持 iOS 8.0 的翼闽,然而很湊巧,我們最近遇到了一個(gè) BUG 就是關(guān)于它的洲炊。
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
然后我們?cè)?Fabric 中收到了 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 的錯(cuò)誤感局, 具體的崩潰就是在 [connection start]
這一行。
于是我們加了一個(gè)判斷:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (!connection) {
return;
}
[connection start];
然而還是依然出現(xiàn)這個(gè)問(wèn)題暂衡,于是我試著 NSLog 直接打印下询微,發(fā)現(xiàn)這個(gè)問(wèn)題又沒(méi)了。狂巢。撑毛。
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
NSLog(@"connection == %@", connection);
[connection start];
然后經(jīng)小伙伴的提醒,直接對(duì) Connection Copy 下這樣就好了
NSURLConnection *connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] copy];
[connection start];
為什么會(huì)這樣呢唧领?
- NSURLConnection :initWithRequest 給出的是一個(gè)自動(dòng)釋放的對(duì)象藻雌, 此時(shí)對(duì)象等同于先自動(dòng)釋放了
- 對(duì)象是否為 nil , 并不代表其是不是野指針
- 而為什么 NSLog 下又沒(méi)出問(wèn)題了,可以這樣理解的斩个。在編譯的時(shí)候胯杭,connection 的對(duì)象相當(dāng)于獲取了,被持有了受啥,運(yùn)行時(shí) connection 的指針就還在的做个,就沒(méi)問(wèn)題的;
而沒(méi)有 NSLog 的情況下滚局,等到編譯完成時(shí)居暖,connection 的對(duì)象自動(dòng)釋放了,沒(méi)有其他的持有其對(duì)象時(shí)藤肢,等到運(yùn)行的時(shí)候就相當(dāng)于野指針了太闺,然而就報(bào)這個(gè)錯(cuò)了。
這個(gè)是 NSURLConnection 老的這個(gè)類之前遺留下的一個(gè)問(wèn)題谤草,之前貌似蘋果還有專門文檔說(shuō)這個(gè)問(wèn)題的跟束,現(xiàn)在木有了莺奸,所以建議以后不要用這個(gè) NSURLConnection丑孩, 畢竟蘋果也是希望用 NSURLSession 替換的冀宴。同時(shí)對(duì)于老代碼中的這個(gè),可以適當(dāng)加上一些持有的動(dòng)作温学,避免出現(xiàn)這個(gè)問(wèn)題略贮。 當(dāng)然對(duì) NSURLConnection 這個(gè)問(wèn)題,有其他好的解決方案歡迎告知罢提逃延!