2011-09-15 9 views
0

私はこのトピックについて多くの質問があることを知っていますが、私のために働いていないものは私のために少し奇妙です。NSMutableDictionary EXC_BAD_ACCESS

まずはスタティックシングルトンクラスを作成します。その後、私は以下のように別のクラスからこのNSMutableDictionaryを呼び出すNSMutableDictionary

static NSMutableDictionary* mydic 
@implementation mySingleton 

-(mySingleton*)getInstance 
{ 
    static mySingleton *sharedInstance; 
    @synchronized(self) 
    { 
     if(!sharedInstance) 
     { 
      sharedInstance = [[mySingleton alloc] init]; 
      mydic = [[NSMutableDictionary alloc] initWithCapacity:1]; 
     } 
     return sharedInstance; 
    } 
} 

-(NSMutableDictionary*)getDictionary 
{ 
    return myDic; 
} 

の変数を宣言します。

NSMutableDictionary* singletonDictionary = [[mySingleton getInstance] getDictionary]; 

MyOtherClass* myclass = [singletonDictionary objectForKey:key];// Key is NSString 
// Here I can see whole the values I added to myClass for that key 
NSArray *checkKey = [singletonDictionary allKeys]; 
for(int i = 0; i < [singletonDictionary count]; i++) 
{ 
    NSLog(@"%@",[checkKey objectAtIndex:i]);// here I can see my key is there 
} 

[singletonDictionary removeObjectForKey:key];// here it crashes EXC_BAD_ACCESS 

私はこの問題について夢中になります。誰かがアイデアを持っているなら、それを私と共有してください。

EDIT:助けを

MyOtherClass * myinstance = [[MyOtherClass alloc] init]; 
// Fill up the instance with the desired variable here 
// Forexample 
// myinstance.name = [NSString stringWithFormat:@"myInstanceName"]; 
. 
. 
. 

[[[mySingleton getInstance] getDictionary] setObject:myinstance forKey:key]// key is an NSString* 
[myinstance release]; 

感謝。

オマールファルクKURT開始する

+0

オブジェクトを辞書に追加したコードも投稿してください。 – xuzhe

答えて

3

非常に多くの問題が、...?

少なくとも、あなたのgetInstanceメソッドは何も返さないと思われます。おそらくmySingletonを返すべきです。これはあなたのEXEC_BAD_ACCESSを説明することができます。singletonDictionaryは恐らくnilです。

シングルトンのインスタンス化も間違っています。シングルトンがすでに作成されているかどうかを確認し、シングルトンのインスタンスがあればそれを返す必要があります。さもなければ、シングルトンを再割当てすることができます。これは不合理です。

静的リファレンスはここではあまり設計されていません。サブクラス化して、ヘッダーファイル内のメンバーを宣言する方が良いです。

これはあなたの問題を解決するかもしれませんが、あなたは明らかに深いところに飛び込んでおり、より多くの問題に遭遇するでしょう。私はあなたがテキストやオンラインでコードの良い例を見つけてそれらを研究する必要があると思います。あなたがすぐにそれをすれば、ロープを学ぶでしょう。

+0

申し訳ありませんが、私は実装するために別のコンピュータを使用しています。私は気にせずに上記のコードを書いています。だから私はそれをチェックしなかった。私はインスタンスを返し、以前に割り当てられていたかどうかを確認します。それは私があなたのためにそれを再び編集すると思う問題ではありません。申し訳ありませんが私はいくつかの間違いをしたので、質問をすることが非常に緊急でした。 :) –

0

NSMutableDictionaryは、辞書に追加されたオブジェクトを保持します。オブジェクトが削除されると、オブジェクトは解放されます。その結果、辞書からオブジェクトを削除すると、そのオブジェクトにアクセスします。以前にオブジェクトを解放していて、それがdeallocされている場合、例外が発生する可能性があります。辞書から削除する前にオブジェクトの状態を調べると、オブジェクトがすでに解放され、解放されている可能性があります。

+0

したがって、このscenerioではobjectForKeyでオブジェクトを取得してからオブジェクトを解放すると、実際には辞書のオブジェクトが解放されますか?だから、それが含まれているオブジェクトをリリースする前に、その瞬間後に辞書オブジェクトのための同じカウントを取得することは容認ですか?編集:私は辞書から得たオブジェクトを解放しませんでした。 –

+0

objectForKeyは、辞書にある同じオブジェクトを返します。ルールに従って、ポインタを取得した後にオブジェクトを保持しない限り、そのオブジェクトに解放を送信しません。辞書内のオブジェクトを解放しても、辞書内のアイテムの数には影響しません。ただし、そのリリースがretainと一致しない場合、ディクショナリがオブジェクトを削除しようとすると例外が発生します。 –

+0

私はコードを何度もチェックアウトします。オブジェクトを解放するのは、辞書に追加した後のオブジェクトだけです。私はsetAnObject:オブジェクトforKey:キーの後、私は[オブジェクトのリリース]をリリースします。それは私がオブジェクトをリリースする唯一の場所です。私はobjectForKey:を呼び出し、それをremoveObjectForKeyの直後に置いています:次の行とobjectForkeyの右の意味は問題ありません。removeObjectForKey:クラッシュさせます。それは私にとってとても変わったようでした。 FYI私は静的ライブラリにこのコードを書いて、別のプロジェクトで使っています。これはクラッシュに影響を与えますか?私はこのクラッシュについてとても切迫している... –