2010-10-10 10 views
0

Je suis un débutant, écrire un programme simple et alors qu'il n'y a pas d'avertissements/erreurs lors de la compilation. J'obtiens une erreur "EXC_BAD_ACCESS". Apprécieront toute aide avec ceci:Objectif C: erreur "EXC_BAD_ACCESS"

int main (int argc, const char * argv[]) { 
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

     moviedatabase *movie1=[[moviedatabase alloc] init]; 

    [movie1 addMovieWithName:@"DDLJ" andyear:1789 andlength:360 andGenre:Horror]; 
    [movie1 printAll]; 
    [movie1 release]; 

    [pool drain]; 

    return 0; 
} 

Voici la classe moviesdatabase et des films de classe dont il hérite:

@interface moviedatabase : movies{ 
//no variables in the class 
} 

-(void) addMovieWithName: (NSString *)mname andyear: (int) myear andlength: (int) mlength andGenre: (enum Genre) mgenre; 
-(void) printAll; 

@end 

@interface movies : NSObject { 
NSString *name; 
int year; 
int length; 
enum Genre {Comedy,Drama,Horror,Action} genre; 
} 

@property (nonatomic) NSString *name; 
@property (nonatomic) int year; 
@property (nonatomic) int length; 
@property (nonatomic) enum Genre genre; 

-(id) initWithName: (NSString *)name andyear: (int) year andlength: (int) length andGenre: (enum Genre) genre; 

@end 

Y compris la mise en œuvre de moviedatabase:

#import "moviedatabase.h" 


@implementation moviedatabase 

-(void) addMovieWithName: (NSString *) mname andyear: (int) myear andlength: (int) mlength andGenre: (enum Genre) mgenre 
    { 
     name=mname; 
    year=myear; 
    length=mlength; 
    genre=mgenre; 

    } 

-(void) printAll; 
{ 
    NSLog(@"name=%@, year=%@, length=%@, genre=%@",name,year,length,genre); 
} 

@end 
+2

Peut-être nous montrer la classe 'moviedatabase' pourrait aider. En outre, lorsque vous affichez le code source, mettez en surbrillance le code dans l'éditeur de questions et appuyez sur l'icône 010101 en haut pour l'indenter. – BoltClock

+0

En tant qu'addendum au commentaire de @ BoltClock, d'après ce que nous pouvons voir dans la fonction 'main' rien n'est hors service, le' EXC_BAD_ACCESS' est issu du code à l'intérieur des méthodes 'addMovieWithName' ou' printAll'. –

+1

@Vatsaf, Nous avons également besoin de voir le '@ implementation'. –

Répondre

4

Votre méthode utilise printAll%@ au lieu de %i pour int les variables.

Ce:

- (void)printAll 
{ 
    NSLog(@"name=%@, year=%@, length=%@, genre=%@", name, year, length, genre); 
} 

devrait ressembler à ceci:

- (void)printAll 
{ 
    NSLog(@"name=%@, year=%i, length=%i, genre=%i", name, year, length, genre); 
} 

En NSLog(), %@ est utilisé pour NSObject s, et les chaînes de format standard printf sont utilisés pour d'autres primitives C, par exemple %i pour int, %u pour unsigned int, %f pour float.

1

Avez-vous regardé à: EXC_BAD_ACCESS signal received?

Ce document a été particulièrement utile pour moi:

http://www.cocoadev.com/index.pl?DebuggingAutorelease

+0

ouais, je l'ai cherché et cherché, mais ne peux toujours pas comprendre :-( –

+0

Je suppose que vous faites cela dans xcode? Si oui, je dirais que vous devriez le mettre en mode débogage, laissez la chose planter, puis obtenir une trace de pile de GDB. (frapper "bt" pour backtrace). – smtlaissezfaire