gpt4 book ai didi

ios - CFRelease(CFArrayRef) 时崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:30:23 24 4
gpt4 key购买 nike

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

-(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);
}

当我发布 CFArrayRef 应用程序崩溃时,这里出了什么问题?据我所知,我必须释放所有从名称包含复制或创建权限的 CF 方法返回的对象?

最佳答案

您可能在这里过度释放了“人”对象。 Infact person 是从一个数组中检索出来的,它遵循“获取规则”,所以你不是它的所有者,你不能释放它(或者:你可以先保留它,如果你不确定对象,然后再释放它生命周期)。在 for 循环结束时,当您释放“people”时,数组会尝试释放其已过度释放的内部对象(“people”),这会导致崩溃。

因此,请尝试删除 CFRelease(people) 语句,或者,为了更加安全,在从数组中获取 person 后立即添加一个 CFRetain(people)(但不要删除 CFRelease(people) 指令)。

关于ios - CFRelease(CFArrayRef) 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16482369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com