Ошибка при создании подкласса NSObject: EXC_BAD_ACCESS

Я пытаюсь создать класс HighscoresController, который является подклассом NSObject. Когда я вызываю метод init следующим образом, я получаю ошибку в отладчике GDB: Program received signal: "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

person codeperson    schedule 19.04.2011    source источник


Ответы (1)


У этой линии две проблемы:

_highscoresList = [HighscoresListOfLists objectAtIndex:kMyListNumber];

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

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

person gerry3    schedule 19.04.2011
comment
большое спасибо за помощь, вы были совершенно правы. Я заменил эту строку на: _highscoresList = [[NSMutableArray alloc] initWithArray:[HighscoresListOfLists objectAtIndex:kMyListNumber]]; и я также удалил первое распределение, которое я сделал ранее для _highscoresList. - person codeperson; 19.04.2011