2011-10-27 85 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; 
} 

當我運行它,我得到

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

在第二日誌語句。

Pre-ARC,我在調用removeObjectAtIndex之前小心的保留了對象,然後自動釋放它。我如何告訴ARC做同樣的事情?

+0

什麼'[自removeObjectAtIndex:我];'怎麼辦? – hypercrypt

回答

5

聲明UIView *view參考與__autoreleasing預選賽中,像這樣:

- (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

@羅伯特對不起,看到更新。 –

+0

謝謝雅各布。兩件事: 1)我不得不使用__unsafe_unretained而不是__weak,因爲我希望保持iOS 4的兼容性。 2)結果該文件沒有打開ARC。愚蠢的錯誤。我必須通過並在目標 - >構建階段 - >編譯源代碼部分中刪除「fno-obj-arc」。 – lewisanderson

相關問題