2012-12-31 61 views
3

可能重複後:
Does lastObject in NSMutableArray return a copy of the object?刪除對象創建一個指向其目的-C]

我下面的iOS開發斯坦福當然,我有一個疑問。 事情是我有一個數組(operandStack)與「操作數」(NSNumbers),我想要一個功能,彈出最後一個元素,然後從數組中刪除它。這是本教程的SAI(和它的作品):

- (double)popOperand 
{ 
    NSNumber *operand = [self.operandStack lastObject]; 
    if(operand) [self.operandStack removeLastObject]; 
    return [operand doubleValue]; 
} 

我的問題是:如果用的NSNumber *操作,我們只是「指點」的最後一個對象,並在下一行,我們刪除此最後一個對象,那我們怎麼可能返回呢?我的意思是,如果我們刪除最後一個對象,操作數只是指向那個對象,那麼操作數應該指向沒有,所以我不明白如何返回操作數是可能的... 我理解代碼如果操作數是數組最後一個對象的副本,但事實並非如此...

對不起,我希望我自己清楚。

謝謝,

卡洛斯

+0

以及你對這個問題的猜測?一些無? – gaussblurinc

+0

是的......我只是不明白爲什麼這個作品!如果操作數指向一個被刪除的對象,操作數應該是零或某些東西,所以返回operand.doubleValue應該什麼也不給... –

回答

4

removeLastObject方法刪除該數組的對象,而不是從存儲器中。從數組中刪除對象之前,將其分配給本地變量。使用ARC進行編譯時,指向對象的局部變量具有隱式的生存期限定符__strong

由於您在將對象從數組中刪除之前添加了對該對象的強引用,所以您的方法暫時取得它的所有權。即使該方法返回對象本身而不是其值,這仍然可以正常工作,因爲ARC會在該方法結束時插入autorelease而不是release

+0

認爲你錯了2個帳戶。首先,這段代碼在沒有ARC的情況下可以很好地工作,這意味着ARC不需要以任何方式改變它。其次,如果ARC會將自動釋放或釋放添加到操作數對象,則它會將其過度釋放,因爲它已經是一個自動釋放對象。 –

+0

@ValentinRadu如果通過'沒有ARC的完美工作',你的意思是它會在調用'doubleValue'時崩潰,那麼是的,那的確是它會做的。在第二點上,ARC使局部變量成爲強引用,即調用'retain',然後在方法的末尾添加對'release'或'autorelease'的調用。這是如何過度放映? – jlehr

+0

@ValentinRadu它可能不會因爲當前寫入而崩潰的原因是因爲'NSNumber'類緩存了它的實例,但是如果集合中的對象沒有被別的東西保留,肯定會崩潰。 – jlehr

相關問題