iOS获取exc错误-访问时间->;CFRelease(iPhoneAddressBook);
为什么我在iOS获取exc错误-访问时间->;CFRelease(iPhoneAddressBook);,ios,objective-c,Ios,Objective C,为什么我在CFRelease(iPhoneAddressBook)上获得exc错误访问权限 如何释放iPhoneAddressBook变量 这是我的密码 ABAddressBookRef iPhoneAddressBook; iPhoneAddressBook = ABAddressBookCreateWithOptions(NULL, NULL); dispatch_semaphore_t sema = dispatch_semaphore_create(0); ABAddressBookR
CFRelease(iPhoneAddressBook)
上获得exc错误访问权限
如何释放iPhoneAddressBook变量
这是我的密码
ABAddressBookRef iPhoneAddressBook;
iPhoneAddressBook = ABAddressBookCreateWithOptions(NULL, NULL);
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(iPhoneAddressBook, ^(bool granted, CFErrorRef error){
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
CFErrorRef error;
[self CheckIfGroupExistWithName:@"group name"];
ABRecordRef group = ABAddressBookGetGroupWithRecordID(iPhoneAddressBook, self->groupId);
ABAddressBookAddRecord(iPhoneAddressBook, group, &error);
ABAddressBookSave(iPhoneAddressBook, &error);
//Create new person and save to this group
ABRecordRef record = ABPersonCreate();
BOOL isSuccess ;
ABRecordSetValue(record, kABPersonFirstNameProperty, (__bridge CFTypeRef)(@"name"), nil);
isSuccess = ABAddressBookAddRecord(iPhoneAddressBook, record, &error);
isSuccess = ABAddressBookSave(iPhoneAddressBook, &error);
ABGroupAddMember(group, record, &error);
ABAddressBookSave(iPhoneAddressBook, &error);
CFRelease(record);
CFRelease(group);
CFRelease(iPhoneAddressBook);
这是NSZombie日志:
0 Malloc +1 1 00:29.823.269 AppSupport _createInstance
1 CFRetain +1 2 00:29.823.360 AppSupport CPRecordLoadHandler
2 CFRelease -1 1 00:29.823.365 AppSupport CPRecordLoadHandler
3 CFRetain +1 2 00:29.823.452 AppSupport CPRecordLoadHandler
4 CFRelease -1 1 00:29.823.507 AppSupport _loadInstanceFromDB
21 CFRetain +1 2 00:30.326.335 AddressBook ABCRecordSetValueAndReturnError
24 CFRetain +1 3 00:30.328.305 AppSupport _createRecordsArrayFromDictionary
25 CFRelease -1 2 00:30.328.460 AddressBook ABCAddressBookSaveWithConflictPolicy
28 CFRelease -1 1 00:30.339.684 AppSupport CPRecordStoreSaveWithPreAndPostCallbacksAndTransactionType
29 CFRelease -1 0 00:30.764.433 DigiPharma -[SpeakerProfileViewController addToContacts:]
30 Zombie -1 00:30.764.698 AppSupport CPRecordStoreDestroy
0 Malloc+1 100:29.823.269 AppSupport\u createInstance
1 CFRetain+1 2 00:29.823.360应用程序支持CPRecordLoadHandler
2 CFRelease-1 100:29.823.365应用程序支持CPRecordLoadHandler
3 CFRetain+1 2 00:29.823.452应用程序支持CPRecordLoadHandler
4 CFRelease-1 100:29.823.507应用支持\u loadInstanceFromDB
21 CFRetain+1 2 00:30.326.335通讯簿ABCRECORDSETVALUE和RETURNERROR
24 CFRetain+1 3 00:30.328.305应用支持\u createRecordsArrayFromDictionary
25 CFRelease-1 2 00:30.328.460通讯簿ABCaddressBooksSaveWithConflictPolicy
28 CFRelease-1 1 00:30.339.684应用程序支持CPRecordStoreSaveWithPre和PostCallBacksandTransactionType
29 CFRelease-1 0 00:30.764.433 Digiphorma-[SpeakerProfileViewController添加到联系人:]
30僵尸-100:30.764.698应用程序支持CPRecordStoreDestroy
关键线路是
CFRelease(group);
ABAddressBookGetGroupWithRecordID
不包含create
或copy
,因此无需释放对象
解决方案:删除该行
从核心基础内存管理文档:
获取规则如果您从任何核心基础函数接收对象,而不是 创建或复制函数(如Get函数)不是您自己的 无法确定物体的寿命。如果你想确保 如果您在使用该对象时未处理该对象,则 必须声明所有权(使用CFRetain功能)。那你是 负责在完成后放弃所有权 它
能否尝试在启用NSZombie的情况下运行应用程序。如果你不知道怎么做,谷歌怎么做。然后发布结果日志,我会提供帮助。如果你释放了对象,应用程序正在崩溃bcz一些对象仍在使用
iPhoneAddressBook
清除代码,只有在我们工作完成后才释放它muku说,你的应用程序中的某个点试图访问iPhoneAddressBook,但它不存在,如果在这一点上它崩溃了,这意味着iphoneaddressbook是零,也许它从来没有被创建过?这就是我说的让他把NSZombie放在那里,我们可能会得到它在哪里的线索。@Maro,你试过实现所有的逻辑吗(在调度信号灯\u等待之后
)ABAddressBookRequestAccessWithCompletion
completion块的内部?就在调度信号量信号(sema)之前你的意思是CFRelease(组)代码>?