2010-11-20 15 views
2

私はObjCとその変更可能な配列にはかなり新しいです。これは私が次のようにします目的C:NSMutableArrayが動作しないのはなぜですか?

;-)狂気私を運転している:

mColumns = [NSMutableArray array]; 
for(int i=0; i<5; i++) [mColumns addObject:[[MyColumn alloc] init]]; 

をそのコードの後、私の配列「mColumnsは、」5つの要素が含まれています。しかし、それらのそれぞれはNULLポインタです! (または、少なくともデバッガが私に言っているものです)。 は、私はすでにコード

[[MyColumn alloc] init] 

は私にいくつかの有効なオブジェクトを与えることを確認したので、私は私の配列が0x0sで満たされます理由はわかりません。 私にヒントを教えてもらえますか?

+1

NSMutableArrayはNULLポインタを保持できません。何とかあなたはデバッガを誤って解釈しています。あなたはNullであると思っていることについて、より具体的にしたいかもしれません。コードには何も問題はありません。 – hooleyhoop

+2

これらの列を解放することを忘れないでください。あなたはそれらを嘲笑したので、あなたはそれらを解放する必要があります。コレクションはその中にあるオブジェクトを所有していることを覚えているので、配列内にある限り死ぬことはありません。 http://developer.apple。com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/ –

+0

デバッガは配列 "NSObject * 0x0の範囲外"の内容として表示されます。それは私にはかわいいね。また、オブジェクト["[[mColumns objectAtIndex:x] addObject:g];のような配列を操作する場合、アプリがクラッシュします。 – Mistefix

答えて

0

私はオブジェクトが正しく割り当てられているとは言いますが、私はそれを確認する傾向があります。ここではより多くのデバッグと同じコードだ:

NSMutableArray *mColumns = [NSMutableArray array]; 
for(int i=0; i<5; i++) { 
    MyColumn *col = [[MyColumn alloc] init]; 
    NSLog(@"%d: %@", i, col); 
    [mColumns addObject:col]; 
    [col release]; 
} 
NSLog(@"Array has %d elements, first is %@", [mColumns count], [mColumns objectAtIndex:0]); 

問題は、(a)は、オブジェクトが正しく作成されていないのいずれかである可能性が高い、または(b)配列要素を持っていますし、あなたは別の問題を抱えています。

+0

'init'が' nil'を返す場合、質問者は配列に 'nil'を含めることができないため、例外を追加しようとすると例外が発生します。質問者は5つのオブジェクトをすべて追加できるので、 'init'は毎回オブジェクトを返しています。たとえオブジェクトが何らかの形で間違ってまたは不完全に初期化されたとしても、そのポインタは 'nil 'にならない。 '0x0'として記録されません。 –

0

Hmmm。私はあなたのコードで1つの問題を見ることができますが、この問題の原因となる問題はありません:配列に保持されているオブジェクトを追加しています。それらを最初に自動解放して漏れないようにしたいと思うでしょう。

あなたの実際の問題については、わかりません。 nullポインタで配列を埋めることは不可能です。 NSArray/NSMutableArrayの中には、タイプid(任意のポインタではない)のオブジェクトのみを入れることができます。

あなたは-[MyColumn init]をチェックしたと言われていますが、この場所に適切なオブジェクトが生成されていることを確認することをお勧めします。

columns = [NSMutableArray array]; 
for (int i = 0; i < 5; i++) { 
    id c = [[[MyColumn alloc] init] autorelease]; 
    /* set a breakpoint here, and type `po c` 
    into the debugger to see what was created 
    */ 
    [columns addObject:c]; 
} 

-[MyColumn init]はいくつかの本当にファンキーなオブジェクトを作成されていない限り、私はこの問題がどうなるかを把握することはできません。 奇妙なことが起こっているかどうかはmColumnsです。例えば、それは何かによって保持されていますか?

2

mutableArrayを保持したい場合は、保持してください。現在のイベントループの終わりに、autoreleasePoolにあるように自動的に割り当てが解除されます。

この時点で、すべての賭けはオフになっています。 mColumns変数はちょうど捨てられたメモリ、おそらく別のオブジェクト、おそらく半分のオブジェクトを指しているかもしれませんが、正しいカウントやオブジェクトを取得できますが、いつかはアプリケーションがクラッシュします。

[[mColumns objectAtIndex:x] addObject:g];がアプリをクラッシュさせた場合、クラッシュを引き起こすのは[mColumns objectAtIndex:x]か、それともaddObject:gですか?

なぜそれらを別々の行に置いて調べるのですか?

関連する問題