2011-02-16 13 views
0

私はObjective Cのインスタンス変数として2次元配列を宣言しようとしています。ヘッダ(データ)にNSMutableArrayがあり、@property(非原子、保持する)。 viewDidLoadでは:私が持っている:目的C 2次元配列メモリの問題

data = [[NSMutableArray alloc] init]; 
[data addObject:[[NSArray alloc] initWithObjects:@"Cheese", @"Meat", @"Veggie", nil]]; 
[data addObject:[[NSArray alloc] initWithObjects:@"Sandwich", @"Soup", @"Stew", nil]]; 

私はメソッド内の配列をのNSLogすることができますし、それが正しいことを、私は別の方法から、それをログに記録しようとすると、しかし、私は何も(単に「@」)を取得していない、と私ならば

NSInteger num = [[data objectAtIndex:component] count]; 

ログにエラーが発生してもクラッシュすることはありません。私はこれがメモリを適切に割り当てないことと関係していると確信していますが、私はObj Cの新機能であり、何年もの間Cスタイルの言語で作業していません。 FWIW、私は[NSArray alloc] initWithObjectsの代わりに[NSArray arrayWithObjects]、そしてその間のすべての組み合わせの代わりにNSArrayを使用することを含め、すべてが失敗する多くのバリアントを試しました。

+0

最後のコメントを無視してください、ごめんなさい。私はあなたがチェックして、コンポーネントが配列の範囲内にあると仮定していますか? – Dre

答えて

1

は、このような外側の配列を作成してみてください:

self.data = [NSMutableArray arrayWithCapacity:2]; // assuming you're only adding 2 inner arrays. 
+0

配列を正しく保持するにはself.dataが必要です。 – jamihash

+0

@ジャミハッシュオリジナルの質問ではない、いいえ。 alloc/initパターンは既に保持されているインスタンスを返します。self.dataを実行すると、GC以外の環境で2回目の保持とメモリリークが発生します。 – Dre

1

以下は、右の方法かもしれません。 @jamihashは、上記のコメントとして、はあなたが適切に配列を保持するself.dataを必要とし、

self.data = [NSMutableArray array]; 
[data addObject:[NSArray arrayWithObjects:@"Cheese", @"Meat", @"Veggie", nil]; 
[data addObject:[NSArray arrayWithObjects:@"Sandwich", @"Soup", @"Stew", nil]; 

注意。そして、あなたがdataに追加している NSArrayの必要はありません。

0

副次的な問題として、子配列を2度保持しています。それらはNSMutableArrayに追加するときに保持されるので、作成時に自動的にオートリリースするか、またはオートレリースされた配列を返すNSArrayメソッドの1つを使用してそれらを作成する必要があります。

コード自体がクラッシュすることはありません。 NSMutableArrayをいつどこで解放して保持するかを調べる必要があります。もっとコードを投稿して、誰かが問題を見つけられると確信しています。