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