2011-04-19 1 views
0

Я пытаюсь создать класс под названием HighscoresController, который подклассифицирует NSObject. Когда я вызываю метод init следующим образом, я получаю сообщение об ошибке в отладчике GDB: Program received signal: "EXC_BAD_ACCESS". Кто-нибудь знает, почему? Я полностью в тупике.Ошибка при подклассе NSObject: «EXC_BAD_ACCESS»

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

Вот моя реализация класса:

#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 

ответ

1

Эта линия имеет две проблемы:

_highscoresList = [HighscoresListOfLists objectAtIndex:kMyListNumber]; 

Вы теряете ссылку на массив вы выделенных ранее в методе - утечка памяти ,

Вы заменяете его ссылкой на объект, который вы не сохраняете. Использование этого после освобождения объекта, безусловно, вызывает проблему с неправильным доступом.

+0

Большое спасибо за помощь, вы были совершенно правы. Я заменил эту строку: _highscoresList = [[NSMutableArray alloc] initWithArray: [HighscoresListOfLists objectAtIndex: kMyListNumber]]; и я также удалил первое выделение, которое я сделал ранее для _highscoresList. – jonsibley

 Смежные вопросы

  • Нет связанных вопросов^_^