這篇是OC的,不是Swift的。
昨晚半夜被叫到公司,說(shuō)是上線的APP在某些機(jī)器上出現(xiàn)閃退。填坑的項(xiàng)目嘛,總歸是吃力不討好的??永锒际菃?wèn)題,老板卻覺(jué)得How old are you?
出問(wèn)題的代碼如下:
ABMutableMultiValueRef multiValue =ABRecordCopyValue(self.record, anID);
CFIndex count= ABMultiValueGetCount(multiValue);
if (multiValue!=nil) {
for (int i =0; i<count; i++) {
CFStringRef strkey = ABMultiValueCopyLabelAtIndex(multiValue, i);
……
}
……
}
CFRelease(strkey); //閃退處
看上去這代碼完全沒(méi)有問(wèn)題,multiValue已經(jīng)做過(guò)非空判斷了,變量i也不會(huì)過(guò)大導(dǎo)致數(shù)組越界。
即便如此,strkey依然有可能為nil。
中圖:有問(wèn)題;右圖:正常
如上圖,中圖是左圖點(diǎn)“電話”標(biāo)簽后的結(jié)果。我們可以看到,中圖沒(méi)有勾,而正常的話應(yīng)該如右圖。
iOS的通訊錄允許為nil的標(biāo)簽,雖然你無(wú)法輸入,但是程序可以這么寫(xiě)入。而iPhone的通訊錄遇到為nil的標(biāo)簽時(shí),會(huì)自動(dòng)顯示一個(gè)默認(rèn)標(biāo)簽。這樣,一個(gè)你看起來(lái)沒(méi)有問(wèn)題的通訊錄,在讀取時(shí)卻出了問(wèn)題。
最后,修正方式還是比較簡(jiǎn)單的,加一個(gè)判斷即可。
if (strkey)
CFRelease(strkey);