这篇是OC的,不是Swift的。
昨晚半夜被叫到公司,说是上线的APP在某些机器上出现闪退。填坑的项目嘛,总归是吃力不讨好的。坑里都是问题,老板却觉得How old are you?
出问题的代码如下:
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); //闪退处
看上去这代码完全没有问题,multiValue已经做过非空判断了,变量i也不会过大导致数组越界。
即便如此,strkey依然有可能为nil。
如上图,中图是左图点“电话”标签后的结果。我们可以看到,中图没有勾,而正常的话应该如右图。
iOS的通讯录允许为nil的标签,虽然你无法输入,但是程序可以这么写入。而iPhone的通讯录遇到为nil的标签时,会自动显示一个默认标签。这样,一个你看起来没有问题的通讯录,在读取时却出了问题。
最后,修正方式还是比较简单的,加一个判断即可。
if (strkey)
CFRelease(strkey);