2011-04-19 4 views
0

NSObjectをサブクラス化するHighscoresControllerというクラスを作成しようとしています。次の方法でinitメソッドを呼び出すと、デバッガGDB: Program received signal: "EXC_BAD_ACCESS"にエラーが発生します。なぜ誰にも分かりませんか?私は完全に困惑している。メモリリーク - あなたが以前の方法で割り当てられた配列への参照を失うNSObjectをサブクラス化するときのエラー: "EXC_BAD_ACCESS"

_highscoresList = [HighscoresListOfLists objectAtIndex:kMyListNumber]; 

#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

この行は、2つの問題がある:

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

はここに私のクラスの実装です。

保持していないオブジェクトへの参照で置き換えます。オブジェクトが解放された後でこれを使用することは、間違ったアクセス例外の原因になります。

+0

本当にありがとうございました。私はその行を次のように置き換えました:_highscoresList = [[NSMutableArray alloc] initWithArray:[HighscoresListOfLists objectAtIndex:kMyListNumber]];私は_highscoresListのために以前に作成した最初の割り当てを削除しました。 – jonsibley

関連する問題