CFRelease(CFArrayRef)时崩溃

taf*_*rel 2 objective-c core-foundation abaddressbook ios

我有清除设备中地址簿的方法。方法如下。

-(void) clearAdressBook
{
    ABAddressBookRef addrBook=ABAddressBookCreate();
    CFArrayRef groups = ABAddressBookCopyArrayOfAllGroups(addrBook);
    if(groups)
    {
        CFIndex numGroups = CFArrayGetCount(groups);
        for(CFIndex idx=0; idx<numGroups; ++idx)
        {
            ABRecordRef groupItem = CFArrayGetValueAtIndex(groups, idx);

                CFArrayRef people=
                ABGroupCopyArrayOfAllMembers(groupItem);
                if(people)
                {
                    CFIndex peopleCount=CFArrayGetCount(people);
                    for(CFIndex ind=0;ind<peopleCount;++ind)
                    {
                        ABRecordRef person=CFArrayGetValueAtIndex(people, ind);
                        ABAddressBookRemoveRecord(addrBook, person, nil);
                        ABAddressBookSave(addrBook, NULL);
                        CFRelease(person);
                    }
                    CFRelease(people);//CRASH
                }

            }
        }

    CFRelease(groups);
}
Run Code Online (Sandbox Code Playgroud)

当我发布CFArrayRef应用程序崩溃时,这是怎么回事?据我所知,我必须释放从CF方法返回的所有对象,这些对象的名称包含复制或创建权吗?

vig*_*o24 5

您可能在这里过度释放了“人”对象。从数组中检索实际人,并且遵循“获取规则”,因此您不是它的所有者,因此无法释放它(或者:如果不确定对象,可以先保留它,然后释放它寿命)。在for循环的最后,当您释放“ people”时,该数组尝试释放其内部对象(“ people”),这些对象已经被过度释放,这将导致崩溃。

因此,请尝试删除CFRelease(people)语句,或者出于安全考虑,在从数组中获取人员之后立即添加CFRetain(people)(但不要删除CFRelease(people)指令)。