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 に答える