2010-07-28 9 views
1

Мое приложение не будет сохранять данные или загружать данные, это просто сбой, интересно, что я делаю неправильно в моем классе High Score Manager.Objective-C NSUserDefaults: HighScoreManager, почему это не работает?

Я собираюсь отправить .h моего класса, и .m файл:

.h

#import <Foundation/Foundation.h> 

@interface Score : NSObject 
{ 
    NSString *name; 
    NSNumber *score; 
} 

@property (assign, nonatomic) NSString *name; 
@property (assign, nonatomic) NSNumber *score; 

+ (Score *) score: (NSNumber *)score_ name: (NSString *)name_; 
- (id) initWithScore: (NSNumber *)score_ name: (NSString *)name_; 

@end 

@interface HighScoreManager : NSObject 
{ 
    NSArray *an_; 
    NSArray *as_; 
    BOOL loaded; 
} 

- (void) load; 
- (BOOL) noScores; 
- (NSArray *) sortedScores; 
- (void) add: (NSString *)name score: (NSNumber *)score; 

@end 

.m

#import "HighScoreManager.h" 

@implementation Score 
@synthesize name, score; 

+ (Score *) score: (NSNumber *)score_ name: (NSString *)name_ 
{ 
    return [[[Score alloc] initWithScore: score_ name: name_] autorelease]; 
} 

- (id) initWithScore: (NSNumber *)score_ name: (NSString *)name_ 
{ 
    if((self = [super init])) 
    { 
     score = score_; 
     name = name_; 
    } 

    return self; 
} 

@end 

@implementation HighScoreManager 

- (id) init 
{ 
    if((self = [super init])) 
    { 
     loaded = NO; 
    } 

    return self; 
} 

- (void) load 
{ 
    if(!loaded) { 
     NSUserDefaults *NSUD = [NSUserDefaults standardUserDefaults]; 
     [NSUD synchronize]; 
     an_ = [NSUD arrayForKey: @"game.score.names"]; 
     as_ = [NSUD arrayForKey: @"game.score.scores"]; 
     [NSUD release]; 

     loaded = YES; 
    } 
} 

- (BOOL) noScores 
{ 
    [self load]; 
    return [an_ count] < 1; 
} 

- (NSArray *) sortedScores 
{ 
    [self load]; 
    NSMutableArray *scoresObj = [NSMutableArray array]; 

    for(NSUInteger i = 0; i < [an_ count]; i++) 
    { 
     [scoresObj addObject: [Score score: [as_ objectAtIndex: i] name: [an_ objectAtIndex: i]]]; 
    } 

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"score" ascending: NO] autorelease]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    return [scoresObj sortedArrayUsingDescriptors: sortDescriptors]; 
} 

- (void) add: (NSString *)name score: (NSNumber *)score 
{ 
    NSUserDefaults *NSUD2 = [NSUserDefaults standardUserDefaults]; 
    [NSUD2 setObject: [[NSUD2 arrayForKey: @"game.score.names"] arrayByAddingObject: name] forKey: @"game.score.names"]; 
    [NSUD2 setObject: [[NSUD2 arrayForKey: @"game.score.scores"] arrayByAddingObject: score] forKey: @"game.score.scores"]; 
    [NSUD2 synchronize]; 
} 

- (void) dealloc 
{ 
    [an_ release]; 
    [as_ release]; 
    [super dealloc]; 
} 

@end 

Как я пытался использовать класс

HighScoreManager *HSM1 = [HighScoreManager new]; 
    [HSM1 add: @"Johannes" score: [NSNumber numberWithInt: 1298]]; 
    [HSM1 add: @"Johannes" score: [NSNumber numberWithInt: 8723]]; 
    [HSM1 add: @"Johannes" score: [NSNumber numberWithInt: 3283]]; 
    [HSM1 add: @"Johannes" score: [NSNumber numberWithInt: 1763]]; 
    [HSM1 add: @"Johannes" score: [NSNumber numberWithInt: 9931]]; 

    HighScoreManager *HSM = [HighScoreManager new]; 

    // Check if there even are any high scores. 
    if([HSM noScores]) 
    { 
     CCLabel *noScoresYet = [CCLabel labelWithString: @"There are no scores yet." fontName: @"Helvetica" fontSize: 36]; 
     noScoresYet.position = ccp(win.width/2, win.height/2); 
     [noScoresYet setColor: ccc3(0, 0, 0)]; 
     [self addChild: noScoresYet]; 
    } else 
    { 
     // Oh look, there were some high scores! 

    } 

    [HSM release]; 

Несмотря на то, что я «сэкономлю» результаты, n Я перемещаюсь от страницы «Оценки» и возвращаюсь обратно, это значит, что приложение аварийно завершает работу. Я не совсем уверен, что я делаю неправильно или почему это не спасает


Я получаю это, когда он выходит из строя «_class_getMethodNoSuper_nolock», а иногда objC_send или что-то подобное

+0

Моя ставка сейчас находится на Присвоить свойства в классе Score (Смотрите мой ответ) –

ответ

1
  • Не выпускать NSUD. Вы не создали его, и вы его не сохранили, поэтому вы его не обладаете. Это может привести к сбою.

  • Вы также должны сохранить переменные экземпляра.

  • [NSUD2 arrayForKey: @"game.score.names"] будет возвращать нуль в начале, поэтому [[NSUD2 arrayForKey: @"game.score.names"] arrayByAddingObject: name] также будет нолем. Вы всегда устанавливаете значения словаря равными нулю.

  • (и избежать имен переменных, как «Ап-». Это делает код трудно читать.)

0

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

return [[[self alloc] initWithScore: score_ name: name_] autorelease]; 

Должно быть

return [[[Score alloc] initWithScore: score_ name: name_] autorelease]; 
+0

Я обновил его и добавил еще немного к вопросу –

0

Не проверить свой код, но первое, что я заметил, это ваши статические фабричные методы, которые пытается Alloc себя вместо класса оценка

Я уверен, что вам нужно:

+ (Score *) score: (NSNumber *)score_ name: (NSString *)name_ 
{ 
    return [[[Score alloc] initWithScore: score_ name: name_] autorelease]; 
} 

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

+0

'[self alloc]' в методе класса является идиоматическим. '[Score alloc]' необычен и звучит как Javaism для меня. Класс должен почти никогда не упоминать себя по имени в методе. Вы ничего не получаете и теряете наследование. – Chuck

+0

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