2011-01-17 5 views
2

私は、特殊なケースが存在するときにwhileループ内でインクリメントされるintカウンタを持つ単純なループを持っています。私の質問は単純です - 具体的にintに関してこの関数の中でどのようにメモリを管理すべきですか?私はNSNumberをほぼ独占的に使用しています。私がintと一緒に過ごした時間は、私が正しくリリースしていないと思うように思えます。intを別のループ内でインクリメントするときの管理方法は?

その他の改善も歓迎されているが、私はint型の質問

- (NSArray *)parseJson:(NSArray *) items 
{ 
    NSMutableArray* hats = [[NSMutableArray alloc] init]; 
    NSEnumerator *enumerator = [items objectEnumerator]; 
    NSDictionary* item; 
    int counterz = 0; 
    while (item = (NSDictionary*)[enumerator nextObject]) { 
    Hat* hat = [[Hat alloc] init]; 

    hat.addr = [item objectForKey:@"Address"]; 

    BOOL* hasHat = [item objectForKey:@"HasHat"]; 

    if ([hasHat boolValue]) { 
     if (counterz < 10) { 
     [hats addObject:hat]; 
     counterz++; 
     } 
    } 
    } 

    return hats; 
} 

に非常に興味が事前にありがとうございます!

答えて

3

...

- (NSArray *)parseJson:(NSArray *) items { 
    NSMutableArray *hats = [NSMutableArray array]; 
    int counter = 0; 
    for (NSDictionary *item in items) { 
    Hat *hat = [[Hat alloc] init]; 
    [hat setAddr:[item objectForKey:@"Address"]]; 
    BOOL hasHat = [[item objectForKey:@"HasHat"] boolValue]; 
    if (hasHat && counter < 10) { 
     [hats addObject:hat]; 
     counter++; 
    } 
    [hat release]; 
    } 
    return hats; 
} 

そして、あなたが達すると一体、10のcounter、あなたがbreak、ループの外にあなたがしている可能性があるため、決して一度10に達すると有用な何かをするつもりです。

いくつかの他のコメント:

  • メソッドの名前が間違っています。このメソッドについては、を解析して JSONとする必要はありません。最高でも、にある辞書の配列をJSON文字列からに変換していますが、このコードでは「これはJSONを解析しています」という性質は何もありません。
  • -[NSDictionary objectForKey:]はオブジェクトを返します。 BOOLはオブジェクトではなく、プリミティブです(intまたはcharなど)。型に*を追加しても、その型にはなりません。 :)
  • メソッド名がnewまたはallocで始まらず、copyという単語が含まれていないため、そこから自動解放されたオブジェクトを返すことになっています。あなたがallocを呼び出したが、autoreleaseを呼び出さなかったため、問題のメソッドは所有オブジェクトを返していた(+1保持カウント)。便利なコンストラクタ+arrayを使用してこれを修正します。
  • ループでは、Hatオブジェクトを割り当てましたが、解放しませんでした。これは古典的なメモリリークです。
+2

+1すべての修正のために、あなたは実際にどのようにintのメモリ管理方法を扱っていませんでした。 (そして再び、私は残りの部分をすべて無視しました): –

+0

@middaparkatouché:) –

+0

@Dave DeLong Yoursは依然として非常に有用なレスポンスIMHOです。 –

6

「通常の」(つまり、オブジェクトベースではない)intをリリースする必要はありません。それは、範囲外になるまで喜んで(短い、悲劇的な)人生をスタック上で生き延びます。

あなたは夫婦不要なものといくつかのメモリリークを持って
+1

s/heap/stack /、実際には –

+0

@Bavarious実際にはそこにスタックがあり、その後ヒープに変更されました。両方を含めるように更新されると思います。 :-) –

+0

申し訳ありません。 'sed'コマンドはヒープの代わりにスタックを意味します。 :-P自動変数がスタックにあります。 –

関連する問題