2

当我从 NSMuttable 数组中弹出最后一个元素时,我在运行时崩溃。我得到所有元素都很好,但是当我访问最后一个元素时,它会出错。

-(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 +),但在我弹出 + 后显示堆栈()为空。但“leftOperand”没有获得价值。我没有使用 ARC。

请详细说明。谢谢。

4

1 回答 1

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'd 对象,它符合方法的命名约定:

- (id)popOperand
{
   id obj = nil;
   if ([self.operandStack count] > 0)
   {
       id obj = [[[self.operandStack lastObject] retain] autorelease];
       [self.operandStack removeLastObject];
   }
   return obj;
}
于 2012-11-09T15:59:53.357 回答