EXC_BAD_ACCESS при попытке освободить ABRecordRef - PullRequest
3 голосов
/ 22 мая 2010

У меня есть следующий класс, который является оберткой вокруг 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

1 Ответ

5 голосов
/ 22 мая 2010

Я чувствую себя застенчивым.У меня был следующий код:

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

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

По-видимому, CFDictionaryGetValue не делает копию ... и, вероятно, поэтому он не имеет Copy в имени функции.Я не сохранил его, и поэтому CFRelease (человек) вызывал освобождение улицы после того, как она уже была возвращена.

Я думаю, остальная часть кода в классе была релевантной.Извините, я постараюсь не допустить этой ошибки при публикации здесь в будущем.

...