2010-07-28 19 views
1

Mon application ne sauvegardera pas les données ou ne chargera pas les données, elle se bloque juste, je me demande ce que je fais mal dans ma classe High Score Manager.Objective-C NSUserDefaults: HighScoreManager, pourquoi cela ne fonctionne-t-il pas?

Je vais poster le .h de ma classe et le fichier .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 

Comment j'ai essayé d'utiliser la classe

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]; 

Même si je "sauvegarde" les scores, n Je m'éloigne de la page Scores et je reviens, c'est l'endroit où l'application plante. Je ne suis pas vraiment sûr de ce que je fais mal ou pourquoi il ne sauve pas


Je reçois quand il se bloque « _class_getMethodNoSuper_nolock » et parfois objC_send ou quelque chose comme ça

+0

Mon pari est actuellement sur les propriétés Assigner dans la classe Score (Voir ma réponse) –

Répondre

1
  • Ne pas libérer NSUD. Vous ne l'avez pas créé et vous ne l'avez pas conservé, vous ne le possédez donc pas. Cela pourrait causer le crash.

  • Vous devez également conserver vos variables d'instance.

  • [NSUD2 arrayForKey: @"game.score.names"] retournera zéro au début, donc [[NSUD2 arrayForKey: @"game.score.names"] arrayByAddingObject: name] sera également nul. Vous définissez toujours les valeurs du dictionnaire sur zéro.

  • (Et éviter les noms de variables comme « an_ ». Votre code est difficile à lire.)

0

Décrivez exactement où la un accident est en train de se produire et peut-être que je peux être plus utile. J'ai repéré au moins une question:

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

devrait être

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

I mis à jour et ajouté un peu plus à la question –

0

N'a pas tester votre code, mais la première chose que j'ai remarqué est vos méthodes d'usine statiques, qui essaie de Alloc auto au lieu de la classe Score

Je suis assez sûr que vous avez besoin:

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

une chose. Vos propriétés dans la classe Score sont déclarées en tant qu'affect, ce qui signifie que vous ne retenez pas le score et le nom que vous obtenez, si elles sont hors de portée, cela bloque également votre application.

+0

'[self alloc]' dans une méthode de classe est idiomatique. '[Score alloc]' est inhabituel et sonne comme un Javaism pour moi. Une classe ne devrait presque jamais se nommer par son nom dans une méthode. Vous ne gagnez rien et perdez l'héritage. – Chuck

+0

Honnêtement, je n'ai jamais écrit obj-c comme ça ou d'autres langues d'ailleurs. Je vois votre point, mais allocate n'est pas une méthode d'instance - comment cela se fait-il, l'instance n'a pas encore été créée.J'ai toujours pensé que la façon objective de créer des objets est étrange. –