2009-11-22 8 views
1

J'ai une interface Adresse suivante:« EXC_BAD_ACCESS »

@interface AddressCard : NSObject 
{ 
    NSString *name; 
    NSString *email; 
} 

@property (copy, nonatomic) NSString *name, *email; 

-(void) print; 
-(void) setName:(NSString *) theName andEmail:(NSString *) theEmail; 
-(void) dealloc; 
@end 

et mise en œuvre:

#import "AddressCard.h" 

@implementation AddressCard 

@synthesize name, email; 

-(void) setName:(NSString *) theName andEmail: (NSString *) theEmail 
{ 
    self.name = theName; 
    self.email = theEmail; 
} 
-(void) print 
{ 
    NSLog (@"=============================="); 
    NSLog(@"| %-21s |", [self.name UTF8String]); 
    NSLog(@"| %-21s |", [self.email UTF8String]); 
    NSLog (@"=============================="); 
} 

-(void) dealloc 
{ 
    [name release]; 
    [email release]; 
    [super dealloc]; 
} 

@end 

Quand je le lance, je continue à obtenir un EXEC_BAD_ACCESS pendant la vidange de la piscine. Je suis incapable de trouver la cause et toute aide est appréciée. C'est mon premier pas dans l'objectif-C alors s'il vous plaît, supportez-moi.

grâce sUnit

+2

Je ne vois rien qui causerait cette erreur dans le code que vous avez posté. Je trouve l'utilisation de UTF8String plutôt que de simplement imprimer la chaîne elle-même suspecte, mais cela ne devrait rien avoir à voir avec n'importe quel pool drainé. Plus probablement l'erreur est dans l'endroit où cette classe est utilisée. – Chuck

Répondre

2

Depuis l'erreur se produit lors de la vidange de la piscine, je pourrais être suspect que vous avez déjà DEALLOCATED l'objet en ce moment-là, et l'objet est sur Desserré (bien que généralement vous obtenez une erreur "malloc double free" pour cela) ou peut-être que la mémoire a déjà été écrasée par autre chose. Je suggère de l'exécuter avec zombies activés, comme dans this answer - si vous avez Snow Leopard, vous pouvez utiliser l'outil Zombies dans Instruments du menu Exécuter de Xcode. Bonne chance!

1

Cet exemple me semble assez familier - j'ai moi-même travaillé sur ce livre moi-même! Le code que vous avez posté ci-dessus est correct, donc le problème doit être ailleurs. Vous pouvez essayer de vérifier the author's forum - le code source pour chacune des étapes de ce chapitre est posté là.

Comme d'autres l'ont suggéré, vous pouvez rechercher des appels de 'libération' supplémentaires.

-1

Puisque vous publiez les chaînes dans votre méthode de dealloc il semblerait que votre objet AddressCard assume la propriété des chaînes, mais vous utilisez cette ligne pour définir les properites:

@property (copy, nonatomic) NSString *name, *email; 

L'utilisation signifie copie que votre objet est ne pas retenir les cordes. Essayez de changer cette ligne à ceci:

@property (retain, nonatomic) NSString *name, *email; 

En utilisant conserver signifie que votre objet conservera les cordes jusqu'à ce que vous les libérer dans votre dealloc.

Espérons que cela va résoudre le problème.

+0

Incorrect. L'attribut 'copy' signifie qu'il appelle le message' -copy' et assume la propriété de la copie. Vous pensez à 'assigner', qui est utilisé pour les primitifs et les délégués, etc. –

+0

Oui, mon erreur, je pensais assign. Excuses. –