2011-03-09 4 views
0

辞書が割り当てられており、私のプログラムのappDelegateに行く準備ができています。私はそれが他のファイル内の外部を編集してから読むことになって NSmutableDictionaryがNSCFStringになっているのはなぜですか?

//appdel.m 
    NSMutableDictionary *dict; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {  

    // Overide point for customization after application launch. 

    dict = [[NSMutableDictionary alloc]init]; 


    dict = HBLoadDictionary(@"/dict.plist"); 

    // Add the tab bar controller's view to the window and display. 
    [self.window addSubview:tabBarController.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

はので、私は他のファイルに存在することが、この辞書を望んでいました。

//viewcontroller.m 
    extern NSMutableDictionary *dict; 

以降では、キーのオブジェクトを設定することにしました。イベントは単なるEKeventです。私は関数の呼び出しを行うとき

NSString* str = [[NSString alloc] initWithFormat:@"%@", event.eventIdentifier]; 
NSString *eID = [[NSString alloc]init]; 
eID = [data valueForKey:@"id"]; 
[dict setObject:str forKey:eID]; 

私はこの

を取得します - [NSCFStringのsetObject:forKeyは:]:認識されていないセレクタがある時点でインスタンス

に送られた私もUIImageを得ましたメモリが問題だと私に信じさせるNSCFStringの代わりに、私はそれを正しく処理していません。なぜそれはそれのようなタイプを変えていますか?その原因が関数呼び出しを混乱させる原因となります...

答えて

2

問題は、割り当てたNSMutableDictionaryがすぐにHBLoadDictionaryの戻り値に置き換えられることです。私はHBLoadDictionaryがあなたがどこにも残っていないautoreleasedオブジェクトを返すと仮定します。辞書を読み込んだ直後に割り当てが解除され、dictは解放されたメモリを指します。また、割り当てた最初のNSMutableDictionaryがリークされます。

あなたはサイドノートとして

dict = [HBLoadDictionary(@"/dict.plist") retain]; 

dict = [[NSMutableDictionary alloc]init]; 
dict = HBLoadDictionary(@"/dict.plist"); 

を置き換えることによって、それを修正することができ、それはObjective-Cのメソッドでグローバル変数を初期化するために悪い習慣です。複数のアプリケーションデリゲートを持つことはおそらくありませんが、そのアプリケーション:didFinishLaunchingWithOptions:メソッドは複数回呼び出されませんが、これは他の状況でメモリリークを引き起こす可能性があります。あなたは静的変数を返すクラスメソッドを持つだけで良い。

+0

あなたの権利私は保持でcメソッドをラップすることは可能だろうとは思わなかった。漏れがある限り、私はかなりの見解を持っていますが、私はそれらにパッチを当てています。私は静的な変数を持つことについて考えなかった、それは私のシングルトンの権利だろうか? – Ohmnastrum

+0

右の静的変数はシングルトンになります。 [MyAppDelegate dict]のようなものを使ってアクセスします。これは、常に同じオブジェクトを返すクラスメソッドです。実装では、静的なNSMutableDictionary変数をnilに初期化します。宣言の後、変数がnilであるかどうかをチェックし、変数がnilである場合は、上記の答えの行を使用して変数を初期化します。 – lazycs

関連する問題