我有以下类,它是 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

我已经省略了一些方法,但它们与这个问题无关。

一切正常,除了我在 EXC_BAD_ACCESS 行上得到一个 if(person) CFRelease(person);。为什么会发生这种情况?我没有在我的应用程序的任何其他地方调用 CFRelease 或 CFRetain。

编辑,另一个注意事项:如果我在 CFRelease 行之前添加它:
NSLog(@"retain count is %d", CFGetRetainCount(person));

它打印 retain count is 1

最佳答案

我觉得很害羞。我有以下代码:

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

NSString *_street = (NSString *)CFDictionaryGetValue(dict,
    kABPersonAddressStreetKey);
if(_street != nil) street = _street;

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

我想类(class)中的其余代码是相关的。抱歉,我会尽量避免以后在这里发帖时犯这个错误。

关于iphone - 尝试释放 ABRecordRef 时的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2885607/

10-10 19:03