2012-01-02 4 views
0

私は2つのオブジェクトを格納するNSMutableArrayを持っていますが、しばらくすると配列のnilに置き換えられます。なぜそれが起こっているのですか?配列オブジェクトはまだ周囲にあり、2つのオブジェクトが含まれていることを示していますが、両方ともnilです。NSArrayのオブジェクトはARCの下でnilに設定されます

配列に含まれているということは、それらが参照されていて削除されるべきではないということですか?

奇妙なのは、配列に置いたオブジェクトが他のオブジェクトによって参照されているときに削除されていないということです。配列のnilに置き換えられているだけです。

-(void)addRender:(id)theRender 
{ 
    if (renderArray == nil) 
     renderArray = [NSMutableArray array]; 

    // Leaving this function and for a while afterwords, the object is in the array. 
    // By afterwords, I think is until the autorelease pool is drained, but I can't 
    // be sure but the objects are there as I am stepping though code. 

    [renderArray addObject:theRender]; 
} 

-(void)render 
{ 
    // By the time this is called, renderArray has 2 nil objects in it. 

    if (renderArray) 
     [renderArray makeObjectsPerformSelector:@selector(render)]; 
} 

-(void)addRender関数がオブジェクトinit関数から呼び出されています。私はそれが重要かどうかわからないが、自己はそれによって設定される。

オブジェクト自体は削除されておらず、配列のnilに置き換えられました。 ARCにはどのような条件がありますか?私はこのようなことをする弱い参照をゼロにすることについて読んだことがありますが、弱い参照を宣言しているわけではありません。

私はこの2時間を頭に打ち負かすことに過ごしました。

+5

すべてのコードを共有してください。 – Devraj

+0

renderArray変数はどのように定義されていますか? – MyztikJenz

+0

次のように定義されています: 'NSMutableArray * renderArray;' –

答えて

0

renderArrayは自動解放オブジェクトです。NSMutableArray *renderArray;と定義している場合は、renderメソッドで使用する前に解放されています。

__strong NSMutableArray *renderArray;と定義してみてください。これは、ARCにあなたの周りを守るよう指示します。

+0

renderArrayが削除されていないので、問題ありません。これは、配列内でnilに設定されているオブジェクトです。私は一点で__strongを試しましたが、何の効果もありませんでした。 –

+0

ええ、私は自分の答えを投稿するとすぐに私はそれについて考え、私はおそらく正しくはなかったことを認識しました。変数が有効であると思われたという事実を見落としました。 – MyztikJenz

関連する問題