2010-06-02 5 views
0

J'utilise un singleton pour stocker des informations sur l'état de l'application. J'inclus le singleton dans une classe Utilities qui le contient (et éventuellement d'autres choses). Cette classe de services est à son tour inclus et utilisé de différents contrôleurs de vue, etc. La classe des services publics est mis en place comme ceci:Définition de l'entrée NSMutableDictionary dans Singleton?

// Utilities.h 
#import <Foundation/Foundation.h> 

@interface Utilities : NSObject { 

} 

+ (id)GetAppState; 
- (id)GetAppDelegate; 

@end 

// Utilities.m 
#import "Utilities.h" 
#import "CHAPPAppDelegate.h" 
#import "AppState.h" 

@implementation Utilities 

CHAPPAppDelegate* GetAppDelegate() { 
    return (CHAPPAppDelegate *)[UIApplication sharedApplication].delegate; 
} 

AppState* GetAppState() { 
    return [GetAppDelegate() appState]; 
} 

@end 

... et le AppState singleton ressemble à ceci:

// AppState.h 
#import <Foundation/Foundation.h> 
@interface AppState : NSObject { 
    NSMutableDictionary *challenge; 
    NSString *challengeID; 
} 
@property (nonatomic, retain) NSMutableDictionary *challenge; 
@property (nonatomic, retain) NSString *challengeID; 
+ (id)appState; 
@end 

// AppState.m 
#import "AppState.h" 

static AppState *neoAppState = nil; 

@implementation AppState 
@synthesize challengeID; 
@synthesize challenge; 

# pragma mark Singleton methods 
+ (id)appState { 
    @synchronized(self) { 
     if (neoAppState == nil) 
      [[self alloc] init]; 
    } 
    return neoAppState; 
} 

+ (id)allocWithZone:(NSZone *)zone { 
    @synchronized(self) { 
     if (neoAppState == nil) { 
      neoAppState = [super allocWithZone:zone]; 
      return neoAppState; 
     } 
    } 
    return nil; 
} 

- (id)copyWithZone:(NSZone *)zone { 
    return self; 
} 

- (id)retain { 
    return self; 
} 

- (unsigned)retainCount { 
    return UINT_MAX; //denotes an object that cannot be released 
} 

- (void)release { 
    // never release 
} 

- (id)init { 
    if (self = [super init]) { 
     challengeID = [[NSString alloc] initWithString:@"0"]; 
     challenge = [NSMutableDictionary dictionary]; 
    } 
    return self; 
} 

- (void)dealloc { 
    // should never be called, but just here for clarity 
    [super dealloc]; 
} 
@end 

... puis, d'un contrôleur de vue, je suis en mesure de définir la propriété « challengeID » du singleton comme ceci:

[GetAppState() setValue:@"wassup" forKey:@"challengeID"]; 

... mais lorsque je tente de définir l'une des valeurs d'entrée du dictionnaire « défi » comme ceci:

[[GetAppState() challenge] setObject:@"wassup" forKey:@"wassup"]; 

... il échoue, ce qui me donne une erreur «sélecteur non reconnu envoyé ...». Toute idée/suggestion sera appréciée.

+1

Pour votre information, votre classe utilities est totalement vide. Vous déclarez deux méthodes, mais ne les implémentez pas, mais écrivez plutôt des fonctions avec le même nom. Vous pouvez totalement supprimer la classe Utilities. – Chuck

Répondre

3

Dans votre méthode -init, vous devez attribuer un dictionnaire au Ivar retenu:

challenge = [[NSMutableDictionary alloc] init]; 
+0

wow ... une si petite chose ... tellement de coups de ma tête contre le mur. JE VOUS REMERCIE! Marquer ceci comme réponse dès que le système le permet. – codemonkey

+0

Le principe magique de la deuxième série d'yeux je suppose :) –

+0

oh ... et j'ai vérifié votre blog d'avertissement sur singletons. Je crois que je vais encore utiliser celui-ci, mais je me considère comme prévenu. Merci encore. – codemonkey