2013-03-03 40 views
0

我有以下代碼:可以同時保留和自動釋放嗎?

@interface MyClass : NSObject 
{ 
    NSMutableArray *items; 
} 
@end 


@implementation MyClass 

-(Item *)getItem 
{ 
    if(items.count < 1) 
    { 
     [self buildItemsArray]; 
    } 
    Item *item = [[[items objectAtIndex:0]retain]autorelease]; 
    [items removeObjectAtIndex:0]; 
    return item; 
} 

-(void)buildItemsArray 
{ 
    // ... 
    [items addItem:someNewItem]; 
    [items addItem:someOtherNewItem]; 
} 
@end 

我有一個返回的項目的功能。如果項目下降到0,則項目數組將再次構建在buildItemsArray中。我的遊戲邏輯要求當我返回一個項目時,我需要將它從數組中移除。因此,我使用了一個保留來確保該項目在返回行之前是有效的(因爲當項目被添加到items數組時,發生了唯一的其他已知保留),以及確保稍後清理它的自動釋放。我已經檢查過這個代碼既沒有崩潰也沒有泄漏。我想知道是否:

a)這是好的 - 我問的原因是,我主要看到代碼與alloc/init/autorelease,並沒有遇到這種情況與保留/ autorelease b)有一些理由分配/初始化/自動釋放,而不是:

Item *item = [[Item alloc]initWithItem:[items objectAtIndex:0]autorelease]; 

感謝

+1

這是不好的,因爲在這個時代你應該使用ARC,並且不會有這個問題開始。只是說'':) – LearnCocos2D 2013-03-03 20:39:53

+0

同意使用ARC那些日子,但對於學習,我認爲這是必不可少的瞭解這是如何工作的。 – Ultrakorne 2013-03-04 00:37:24

+0

我們打算使用ARC,但是想在修復之前修復現有的泄漏,以便我們瞭解它是如何工作的。 – Anand 2013-03-04 01:46:36

回答

1

這通常是確定:

Item *item = [[[items objectAtIndex:0] retain] autorelease]; 
[items removeObjectAtIndex:0]; 
return item; 

雖然這將使意圖更清晰(返回一個自動釋放對象):

Item *item = [[items objectAtIndex:0] retain]; 
[items removeObject:item]; 
return [item autorelease]; 

沒有理由alloc/init。這隻會增加不必要的開銷。

就像我在我的評論中所說的,如果這是一個(相對)新的項目,你確實應該使用ARC,而不再擔心這些事情。

+0

同意 - 將做ARC(事實上,已經完成了所有測試並嘗試過) - 想在修改ARC之前修正泄漏,以便了解... – Anand 2013-03-04 02:39:17