Установка записи NSMutableDictionary внутри Singleton? - PullRequest
0 голосов
/ 02 июня 2010

Я использую синглтон для хранения информации о состоянии приложения. Я включаю синглтон в класс Utilities, который содержит его (и, в конечном итоге, другие вещи). Этот класс утилит, в свою очередь, включается и используется различными контроллерами представления и т. Д. Класс утилит устанавливается следующим образом:

// 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

... и синглтон AppState выглядит следующим образом:

// 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

... затем из контроллера представления я могу установить свойство singleID "challengeID" следующим образом:

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

... но когда я пытаюсь установить одно из значений словаря «вызова», например:

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

... не удается выдать ошибку "нераспознанный селектор отправлен ...". Любые идеи / предложения будут оценены.

1 Ответ

3 голосов
/ 02 июня 2010

В вашем методе -init вы должны назначить сохраненный словарь для ivar:

challenge = [[NSMutableDictionary alloc] init];
...