为什么我会在CFRelease(iPhoneAddressBook)
获得错误访问?
如何发布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 :(得分:2)
关键路线是
CFRelease(group);
ABAddressBookGetGroupWithRecordID
不包含create
也不包含copy
,因此无需释放该对象。
解决方案:删除该行。
来自Core Foundation内存管理文档:
获取规则
如果从任何Core Foundation函数接收对象,则不是 创建或复制功能 - 例如Get功能 - 您不拥有它 并且无法确定物体的寿命。如果你想确保 当你使用它时,你不会丢弃这样的物体 必须拥有所有权(使用CFRetain功能)。那你就是 当你完成后,负责放弃所有权 它