2011-04-19 2 views
0

J'essaie de créer une classe appelée HighscoresController qui sous-classe NSObject. Lorsque j'appelle la méthode init de la manière suivante, j'obtiens une erreur dans le débogueur GDB: Program received signal: "EXC_BAD_ACCESS". Est-ce que quelqu'un a une idée pourquoi? Je suis complètement perplexe.Erreur lors du sous-classement de NSObject: "EXC_BAD_ACCESS"

// Initialize the highscores controller 
_highscoresController = [[HighscoresController alloc] init]; 

Voici mon implémentation de la classe:

#import "HighscoresController.h" 
#import "Constants.h" 

@implementation HighscoresController 

@synthesize highscoresList = _highscoresList; 

- (id) init { 

    self = [super init]; 

    _highscoresList = [[NSMutableArray alloc] initWithCapacity:kHighscoresListLength]; 
    int kMyListNumber = 0; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"highscores.plist"]; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { // if settings file exists 
     NSArray *HighscoresListOfLists = [[NSArray alloc] initWithContentsOfFile:filePath]; 
     _highscoresList = [HighscoresListOfLists objectAtIndex:kMyListNumber]; 
     [HighscoresListOfLists release]; 
    } else { // if no highscores file, create a new one 
     NSMutableArray *array = [[NSMutableArray alloc] init]; 
     [array addObject:_highscoresList]; 
     [array writeToFile:filePath atomically:YES]; 
     [array release]; 
    } 
    [_highscoresList addObject:[NSNumber numberWithFloat:0.0f]]; 

    return self;  
} 

- (void) addScore:(float)score { 
    // Implementation 
} 

- (BOOL) isScore:(float)score1 betterThan:(float)score2 { 
    if (score1 > score2) 
     return true; 
    else 
     return false; 
} 

- (BOOL) checkScoreAndAddToHighscoresList:(float)score { 
    NSLog(@"%d",[_highscoresList count]); 
    if ([_highscoresList count] < kHighscoresListLength) { 

     [self addScore:score]; 
     [self saveHighscoresList]; 
     return true; 

    } else { 

     NSNumber *lowScoreNumber = [_highscoresList objectAtIndex:[_highscoresList count]-1]; 
     float lowScore = [lowScoreNumber floatValue]; 
     if ([self isScore:score betterThan:lowScore]) { 

      [self addScore:score]; 
      [self saveHighscoresList]; 
      return true; 

     } 

    } 

    return false; 

} 

- (void) saveHighscoresList { 
    // Implementation 
} 

- (void) dealloc { 
    [_highscoresList release]; 
    _highscoresList = nil; 
    [super dealloc]; 
} 

@end 

Répondre

1

Cette ligne a deux problèmes:

_highscoresList = [HighscoresListOfLists objectAtIndex:kMyListNumber]; 

Vous perdez la référence au tableau que vous avez alloué plus tôt dans la méthode - une fuite de mémoire . Vous le remplacez par une référence à un objet que vous ne conservez pas.

L'utilisation de cet objet après la libération de l'objet provoque certainement votre mauvaise exception d'accès.

+0

merci beaucoup pour l'aide, vous étiez tout à fait raison. J'ai remplacé cette ligne par: _highscoresList = [[NSMutableArray alloc] initWithArray: [HighscoresListOfLists objectAtIndex: kMyListNumber]]; et j'ai également supprimé la première allocation que j'avais faite précédemment pour _highscoresList. – jonsibley