ABMultiValueCopyLabelAtIndex返回nil

这篇是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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容