2011-09-14 10 views
0

私は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が状態を変更しない限り、フリーズすることなく動作するように見えます。

答えて

2

凍っていない、クラッシュしています。従ってEXC_BAD_ACCESS。あなたのXcodeのインストールもボルケージされているようですが、それに続く2つのメッセージは起こらないはずです。

メソッドには、名前に_が含まれないようにしてください。問題の原因ではなく、条約に従うコメント。

あなたはcharStatesを保持しておらず、クラッシュの原因である可能性があります。

+0

プログラミング文法のおかげで..どのように私はそれを保持していないのですか? – VagueExplanation

+0

私もcharStates = [[NSMutableDictionary alloc] retain]を試しました。ここで一種の混乱している。 – VagueExplanation

+0

私の理解では、dictionaryWithObjectsはオートレリッシュされた辞書なので、最初はそれを保持する必要はありません。 – VagueExplanation

2

答えはありませんが、私は上記のコメント欄に十分なスペースがありませんでしたが、役に立つかもしれません。

bbumが既に述べたように、charStatesを保持していないことが問題になりそうです。

オブジェクトを保持したり保持したりすることが混乱する場合は、「MacでObjective-Cを学ぶ」という本がありますが、Macの本だとわかっていますが、そのほとんどはiPhoneにも当てはまります。第9章(メモリ管理)の171ページでは、「メモリ管理規則」について説明します。また、Objective Cメモリ管理の単純なルールを理解していないかどうかを混乱させる方法について説明します。

new、allocまたはcopyを使用してオブジェクトを作成すると、保持カウントは自動的に1に設定され、オブジェクトは保持され、保持する必要はなく、割り当てを解除するために後続のリリースが必要になります。

オブジェクトを別の方法で作成すると、そのオブジェクトは自動リリースされたオブジェクトになります。

明らかに、これらのルールは標準のiOSライブラリにのみ適用され、必ずしも第三者のライブラリに適用することはできません。

Objective Cのメモリ管理を完全に理解していない人は、この本を読むことをお勧めします。私は私のiPhoneの仕事でさえ非常に啓発されていました。 /を助ける希望。

関連する問題