Я использую синглтон для хранения информации о состоянии приложения. Я включаю синглтон в класс 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"];
... не удается выдать ошибку "нераспознанный селектор отправлен ...". Любые идеи / предложения будут оценены.