iOS在>获得了非常糟糕的访问权限CFRelease(iPhoneAddressBook);

时间:2015-08-27 12:10:07

标签: ios objective-c

为什么我会在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

1 个答案:

答案 0 :(得分:2)

关键路线是

CFRelease(group);

ABAddressBookGetGroupWithRecordID不包含create也不包含copy,因此无需释放该对象。

解决方案:删除该行。

来自Core Foundation内存管理文档:

  

获取规则
  如果从任何Core Foundation函数接收对象,则不是   创建或复制功能 - 例如Get功能 - 您不拥有它   并且无法确定物体的寿命。如果你想确保   当你使用它时,你不会丢弃这样的物体   必须拥有所有权(使用CFRetain功能)。那你就是   当你完成后,负责放弃所有权   它