2012-11-09 28 views
2

我在運行時崩潰時,彈出了最後一個元素從NSMuttable array.I獲取所有元素正常,但是當我獲取最後一個元素時它會給出錯誤。無法在運行時從nsarray崩潰中獲取變量

-(id)popOperand{ 
    id operandObject = [self.operandStack lastObject]; 
    if(operandObject) [self.operandStack removeLastObject]; 
    return operandObject; 
} 

對於例如: - 如果在我的堆棧我有 「8」(及其NSNumber的對象) 「+」(其的NSString對象)2(其的NSNumber對象)。

NSNumber *rightOperand = [self popOperand]; 
NSString *operation = [self popOperand]; 
NSNumber *leftOperand = [self popOperand];//when i acess 8 it shows empty array other   element is getting fine; 

我的問題是爲什麼我無法獲得最後一個對象,而這個功能對其他元素工作正常。 編輯:在運行時彈出2後它顯示堆棧(8 +),但在我poped +它顯示堆棧()empty.But「leftOperand」沒有獲得價值。我沒有使用ARC。

請精心準備。 謝謝。

+1

什麼錯誤.... – Peres

+1

@JackyBoy EXBadAcess – iosman

+2

後的堆棧跟蹤? – trojanfoe

回答

0

如果你不使用ARC那麼你有內存管理問題:

- (id)popOperand 
{ 
    id operandObject = [self.operandStack lastObject];  // Still retained by operandStack 
    if(operandObject) [self.operandStack removeLastObject];// Released by operandStack 
    return operandObject;         // Could be dealloc'd any time now! 
} 

試試這個版本,它返回一個retain「d和autorelease」三維目標,這符合該方法的命名約定:

- (id)popOperand 
{ 
    id obj = nil; 
    if ([self.operandStack count] > 0) 
    { 
     id obj = [[[self.operandStack lastObject] retain] autorelease]; 
     [self.operandStack removeLastObject]; 
    } 
    return obj; 
} 
+0

感謝您提供的解決方案,但你能解釋爲什麼這個函數正確地給予其他兩個值。 – iosman

+1

@ user1589745好運。 – trojanfoe