尝试释放ABRecordRef时EXC_BAD_ACCESS

syn*_*nic 3 iphone cocoa core-foundation

我有以下类是ABPerson(ABRecordRef)的包装器:

@interface Recipient : NSObject {
 ABRecordRef person;
}

- (id)initWithPerson:(ABRecordRef)person;

@end

@implementation 

- (id)initWithPerson:(ABRecordRef)_person {
 if(self = [super init]) person = CFRetain(_person);
 return self;
}

- (void)dealloc {
 if(person) CFRelease(person);

 [super dealloc];
}

@end
Run Code Online (Sandbox Code Playgroud)

我已经离开了一些方法,但它们与这个问题无关.

一切都很好,除了我EXC_BAD_ACCESSif(person) CFRelease(person);线.为什么会这样?我在我的应用程序的任何其他地方都没有调用CFRelease或CFRetain.

编辑,另一个注意事项:如果我在CFRelease行之前添加此权限:

NSLog(@"retain count is %d", CFGetRetainCount(person));
Run Code Online (Sandbox Code Playgroud)

它打印 retain count is 1

syn*_*nic 5

我感到羞怯.我有以下代码:

// getting the address
CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(multi, addressIndex);

NSString *_street = (NSString *)CFDictionaryGetValue(dict,
    kABPersonAddressStreetKey);
if(_street != nil) street = _street;    
Run Code Online (Sandbox Code Playgroud)

显然,CFDictionaryGetValue不会复制......这可能就是它Copy在函数名称中没有的原因.我没有保留它,因此CFRelease(人)导致街道在被收回后被释放.

我猜这个代码中的其余代码是相关的.对不起,我将来会发布这个错误.