2011-10-27 11 views
6

私はいくつかのコードをARCに変換しています。コードはNSMutableArray内の要素を検索し、その要素を見つけて削除して返します。問題は、要素が「removeObjectAtIndex」とすぐに割り当てを解除されることをある:私はそれを実行するとremoveObjectAtIndexによって「メッセージは割り当て解除されたインスタンスに送信されます」

- (UIView *)viewWithTag:(int)tag 
{ 
    UIView *view = nil; 
    for (int i = 0; i < [self count]; i++) 
    { 
     UIView *aView = [self objectAtIndex:i]; 
     if (aView.tag == tag) 
     { 
      view = aView; 
      NSLog(@"%@",view); // 1 (view is good) 
      [self removeObjectAtIndex:i]; 
      break; 
     } 
    } 
    NSLog(@"%@",view); // 2 (view has been deallocated) 
    return view; 
} 

は、私は2番目のログのステートメントで

*** -[UIView respondsToSelector:]: message sent to deallocated instance 0x87882f0 

を取得します。

Pre-ARC、removeObjectAtIndex:を呼び出す前にオブジェクトを保持してから、自動解放してください。 ARCに同じことをするにはどうすればいいですか?

+0

'[自己removeObjectAtIndexを:i]を参照してください;'か? – hypercrypt

答えて

5

はそうのように、__autoreleasing修飾子でUIView *view参照を宣言します。

- (UIView *)viewWithTag:(int)tag 
{ 
    __autoreleasing UIView *view; 
    __unsafe_unretained UIView *aView; 

    for (int i = 0; i < [self count]; i++) 
    { 
     aView = [self objectAtIndex:i]; 
     if (aView.tag == tag) 
     { 
      view = aView; 
      //Since you declared "view" as __autoreleasing, 
      //the pre-ARC equivalent would be: 
      //view = [[aView retain] autorelease]; 

      [self removeObjectAtIndex:i]; 
      break; 
     } 
    } 

    return view; 
} 

__autoreleasingはあなたにを与える正確あなたは割り当てに新しい指示先が保持されているため、自動解放し、その後に格納欲しいもの左辺値。

ARC reference

+2

私は '__strong'がデフォルトだと思ったのですか?とにかくこれはやらない? – Robert

+0

@Robert申し訳ありませんが、更新された参照してください。 –

+0

ありがとう、ヤコブ。 2つのこと: 1)iOS 4との互換性を維持したいので、__weakの代わりに__unsafe_unretainedを使用する必要がありました。 2)そのファイルのARCがオンになっていません。ダムの間違い。私は、ターゲット→ビルドフェーズ→コンパイルソースセクションで "fno-obj-arc"を削除しなければなりませんでした。 – lewisanderson

関連する問題