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方法返回的所有对象,这些对象的名称包含复制或创建权吗?
您可能在这里过度释放了“人”对象。从数组中检索实际人,并且遵循“获取规则”,因此您不是它的所有者,因此无法释放它(或者:如果不确定对象,可以先保留它,然后释放它寿命)。在for循环的最后,当您释放“ people”时,该数组尝试释放其内部对象(“ people”),这些对象已经被过度释放,这将导致崩溃。
因此,请尝试删除CFRelease(people)语句,或者出于安全考虑,在从数组中获取人员之后立即添加CFRetain(people)(但不要删除CFRelease(people)指令)。
| 归档时间: |
|
| 查看次数: |
2911 次 |
| 最近记录: |