2010-05-21 6 views
3

J'ai la classe suivante qui est un wrapper autour d'un ABPerson (ABRecordRef):EXC_BAD_ACCESS en essayant de libérer un 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 

J'ai laissé quelques-unes des méthodes sur, mais ils ne sont pas pertinentes à cette question.

Tout fonctionne bien, sauf que je reçois un EXC_BAD_ACCESS sur la ligne if(person) CFRelease(person);. Pourquoi cela arrive-t-il? Je n'appelle pas CFRelease ou CFRetain du tout ailleurs dans mon application.

Edition, une autre note: Si j'ajoute ce droit avant la ligne CFRelease:

NSLog(@"retain count is %d", CFGetRetainCount(person)); 

Il imprime retain count is 1

+1

Est-il possible que l'objet ABRecordRef 'person' ait un objet interne qui est supprimé avant que CFRelease ait été appelé ?? – Justin

+0

C'est possible, mais j'ai regardé, et je ne peux pas imaginer où cela serait. – synic

+1

Eh bien, il n'y a rien de mal avec ce code que je peux voir, alors soit vous faites quelque chose dans d'autres méthodes ou Justin a la réponse – Andiih

Répondre

5

je me sens penaud. J'ai eu le code suivant:

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

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

Apparemment, CFDictionaryGetValue ne fait pas une copie ... et c'est probablement la raison pour laquelle il n'a pas Copy au nom de la fonction. Je ne le retenais pas, et CFRelease (personne) faisait libérer la rue après qu'elle ait été récupérée.

Je suppose que le reste du code de la classe était pertinent. Désolé, je vais essayer de ne pas faire cette erreur en postant ici dans le futur.