2010-06-10 3 views
1

Voici ma classe personnalisée:Obj-C: appeler la libération/dealloc provoque EXC_BAD_ACCESS

PolygonShape : NSObject { 
int numberOfSides; 
int minimumNumberOfSides; 
int maximumNumberOfSides; 
} 

Ma méthode init personnalisée:

- (id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max { 
if (self = [super init]) { 
    [self setMinimumNumberOfSides:min]; 
    [self setMaximumNumberOfSides:max]; 
    [self setNumberOfSides:sides]; 
} 

return self; 
} 

Ma méthode dealloc:

- (void) dealloc { 
NSLog("Calling dealloc"); 
[super dealloc]; 
} 

Mon exemple de code qui plante:

PolygonShape *shape1 = [[PolygonShape alloc] initWithNumberOfSides:6 minimumNumberOfSides:5 maximumNumberOfSides:9]; 
[shape1 release]; 

J'ai alloué un PolygonShape en augmentant le nombre de retainer de 1, puis en le relâchant, je le décrémenterais à 0 et j'appellerai dealloc, en imprimant ce message à NSLog mais je viens d'obtenir EXC_BAD_ACESS. Je suis en mesure d'accéder et de modifier les champs de mon objet après l'avoir créé afin que tout fonctionne jusqu'à ce qu'il fonctionne. Merci beaucoup pour l'aide!

+0

Avez-vous une piscine autorelease correcte? (la seule idée que j'ai actuellement!) – ShinTakezou

+0

N'oubliez pas de vérifier l'affichage de dreamlax comme la bonne réponse. –

Répondre

6
NSLog("Calling dealloc"); 

Vous passez une chaîne C régulière, plutôt qu'un NSString. Vous devez faire ceci:

NSLog(@"Calling dealloc"); 

Votre compilateur aurait dû vous prévenir de passer un pointeur incompatible.

+0

Ça l'a fait! Bon oeil! – Mark

+0

+1 spécialement pour "votre compilateur aurait dû avertir ..." ... nous apprenons: ne jamais ignorer les avertissements! – ShinTakezou

0

Avez-vous ajouté ces derniers dans la @interface ...

@property(assign) int numberOfSides, minimumNumberOfSides, maximumNumberOfSides; 

et ceux-ci dans le @implementation?

@synthesize numberOfSides, minimumNumberOfSides, maximumNumberOfSides; 

Les setters ne seront pas générés automatiquement à moins que vous explicitement @synthesize il.

+0

J'ai dans .h @property int numberOfSides; @property int nombre minimal de côtés; @property int nombreNuméroSecondes; Et en .m: @synthesize numberOfSides; @synthesize minimumNumberOfSides; @synthesize maximumNumberOfSides; Ces setters/getters fonctionnent très bien. Mon problème est avec l'allocation et la libération. Je pensais que rien de spécial ne devait être fait puisque aucun de mes ivars ne sont des objets. – Mark

+0

ne devrait-il pas causer un autre type de problème (par exemple, comme un sélecteur inconnu)? Je pense aussi au pool autorelease ... – ShinTakezou

+0

@Mark: Je ne vois aucun bogue de gestion de la mémoire dans votre code. – kennytm

0

Sur quelle ligne se plante-t-il? L'erreur peut-elle être dans l'une des méthodes que vous appelez dans initWithNumberOfSides?

Si vous le faites « construire et déboguer » pour trouver où il se bloque ne fonctionne pas, je me retournais sur NSZombieEnabled pour trouver le problème (ne pas oublier de l'éteindre à nouveau!)

Questions connexes