美文网首页
ABMultiValueCopyLabelAtIndex返回ni

ABMultiValueCopyLabelAtIndex返回ni

作者: 阿影 | 来源:发表于2017-02-07 15:04 被阅读51次

这篇是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);

相关文章

网友评论

      本文标题:ABMultiValueCopyLabelAtIndex返回ni

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