私はCocos2Dフレームワークを使用してObjective-Cをコーディングしていますが、私はシングルトンを複数の目的で使用しています。新しい目的の1つは、文字列である文字の「状態」を取得して設定することです。私は最近、この目的のためにNSDictionaryを作ったが、シングルトン内のメソッドが呼び出されたときにプログラムがフリーズする問題がある。NSMutableDictionaryシングルトンの問題
ここにシングルトンコードがあります。私は文字の状態のもので残している:
の.h
@interface ExGlobal : NSObject {
NSArray *charStates_keys;
NSArray *charStates_objects;
NSMutableDictionary *charStates;
}
@property(nonatomic, retain) NSMutableDictionary *charStates;
+(ExGlobal*)sharedSingleton;
- (NSString *)charState:(NSString *)charName;
- (void)set_charState:(NSString *)value forCharName:(NSString *)charName;
@end
.M
#import "ExGlobal.h"
@implementation ExGlobal
@synthesize charStates;
static ExGlobal* _sharedSingleton = nil;
+(ExGlobal*)sharedSingleton {
@synchronized([ExGlobal class]) {
if (!_sharedSingleton) {
[[self alloc] init];
}
return _sharedSingleton;
}
return nil;
}
+(id)alloc {
@synchronized([ExGlobal class]) {
NSAssert(_sharedSingleton == nil, @"Attempted to allocate a second instance of a singleton.");
_sharedSingleton = [super alloc];
return _sharedSingleton;
}
return nil;
}
-(id)init {
self = [super init];
if (self != nil) {
// initialize stuff here
exitName = @"ruinsSkyMid";
sceneChangeKind = @"reborn";
charStates = [[NSMutableDictionary alloc] init];
charStates_keys = [NSArray arrayWithObjects:@"Feathers", @"Hummus", nil];
charStates_objects = [NSArray arrayWithObjects:@"at wall", @"with Feathers", nil];
charStates = [NSMutableDictionary dictionaryWithObjects:charStates_objects forKeys:charStates_keys];
}
return self;
}
- (NSString *)charState:(NSString *)charName{
NSString *value = [charStates objectForKey:charName];
return value;
}
- (void)set_charState:(NSString *)charState forCharName:(NSString *)charName{
[charStates setObject:charState forKey:charName];
}
- (void)dealloc {
//I know it doesn't get called, but just in case
[charStates release];
[super dealloc];
}
@end
それがフリーズしたときに、正確な問題が何であるか私には不明です。この場合、コンソールに入るのは次のとおりです。
Program received signal: “EXC_BAD_ACCESS”.
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.5 (8L1)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).
Previous frame inner to this frame (gdb could not unwind past this frame)
Previous frame inner to this frame (gdb could not unwind past this frame)
私はこの問題を見つけるのに役立つとは確信していません。 charState_keysとcharStates_objectsとcharStatesをcharStateとset_charStateの両方のメソッドの中に再定義すると、set_charStateが状態を変更しない限り、フリーズすることなく動作するように見えます。
プログラミング文法のおかげで..どのように私はそれを保持していないのですか? – VagueExplanation
私もcharStates = [[NSMutableDictionary alloc] retain]を試しました。ここで一種の混乱している。 – VagueExplanation
私の理解では、dictionaryWithObjectsはオートレリッシュされた辞書なので、最初はそれを保持する必要はありません。 – VagueExplanation