2011-02-06 7 views
0

私はCocoa開発者ではありませんが、PhoneGap用のプラグインをいくつかビルドしています。この特定のプラグインメソッドは、1)理由を言わずにアプリをクラッシュさせるか、または2)どのようにオブジェクトを解放/解放しないかについて不平を言うことです。私は、forループの代わりに列挙子を使用することを含め、私の最後に大量のものを試しました。誰かが正しい方向に私を指すことができる場合は、それは素晴らしいだろう。NSMutableDictionaryを作成して作成しようとするとメモリエラーが発生する

- (void)getPreferences:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { 
    NSUInteger argc = [arguments count]; 
    NSString* jsCallback = nil; 

    if (argc > 0) { 
     jsCallback = [arguments objectAtIndex:0]; 
    } else { 
     NSLog(@"Preferences.getPreferences: Missing 1st parameter."); 
     return; 
    } 

    NSDictionary *defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; 
    NSMutableArray *keys = (NSMutableArray *) [options objectForKey:@"keys"]; 
    NSMutableDictionary *values = [[NSMutableDictionary alloc] init]; 

    NSUInteger ky = [keys count]; 
    for (int i = 0; i < ky; i ++) { 
     @try { 

      [values setObject:[defaults objectForKey:[keys objectAtIndex:i]] forKey:[keys objectAtIndex:i]]; 
     } 
     @catch (NSException * err) { 
      NSLog(@"Error %@", err); 
     } 
    } 

    [keys release]; 

    NSString* jsString = [[NSString alloc] initWithFormat:@"%@(%@);", jsCallback, [values JSONRepresentation]]; 

    [defaults release]; 
    [values release]; 

    [webView stringByEvaluatingJavaScriptFromString:jsString]; 

    [jsString release]; 
} 

人間バージョン:

  1. optionsキーをしようとしている文字列の配列を(含まれていることを「キー」
  2. の単一キーで辞書が含まれています、私は取材を気にしません
  3. は、私がdefaults Fに存在するすべての値については、そのアレイ
  4. をループにしたい)のルックアップのためのキーとして使用すること同じキーを使ってvaluesにコピーしてください
  5. 最後に、valuesをJSONとして送り返したいと思います(この部分は、defaultsオブジェクト全体を渡したときに動作していたので、JSONメソッドが機能していると思います)あなたのコードから
+0

完全にオフトピック何かにお邪魔して申し訳ありませんが、あなたは持って起こるんダウンロードサイトのニュース?どこかに鏡がありますか?私はそれを指し示すいくつかのポストを持っていて、あなたのgithubプロファイルにリンクするようにそれらを編集しました。それは今のところ最高の場所ですか? –

+0

@Pekka、そうです。新しい家はおそらくlabs.dougneiner.com/downloadifyにあります。私はその名前を更新しないための馬鹿みたいな気がします...私がした時までには、それは数日遅れました。 #fail –

答えて

2

、あなたが自身の "valuesjsString(あなたがallocで作成したもの)オブジェクトなので、あなたが他のそれらを解放してはならないということになります。
メモリ管理に関する詳細はhereを読むことができます。

これはコード全体ですか?また、正確に何かエラーがありますか?

+0

+1うわー、それを修正した他の2つのリリースコールを削除する。また、それを所有しているという概念は私には意味がありました。このような迅速な対応に感謝します! –

+1

@Doug私が追加したリンクは、一般的な概念の理解に役立つはずです。幸運:) –

1

ニキータが正しいですが、それは自動解放プールが解放されたときにクラッシュする可能性のある、defaultsを過消去しているように見えます。また、私はあなたが正しく何をしようとして理解していれば、あなたは単一のコード行でvalues辞書を作成することができます。

NSDictionary *values = [defaultsDict dictionaryWithValuesForKeys:keys]; 
+0

はい、まさに私が欲しかったことです。うわー、それは私が思ったよりも簡単だった。ありがとうございました! +1 –

関連する問題