0

コメント行に「Objective-Cオブジェクトではない」というエラーが返されるのはなぜか完全にはわかりません。どんな助けでもいただければ幸いです。

さらに、私はObjective-Cを初めて使用しますが、これは非常にばかげた間違いである可能性が高いことを認識しています。ただし、アドバイスは役に立ちます。

#import "CalculatorBrain.h"

@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray *operandStack;
@end

@implementation CalculatorBrain

@synthesize operandStack = _operandStack;

- (NSMutableArray *)operandStack
{
    if(!_operandStack){
    _operandStack = [[NSMutableArray alloc] init];
    }// end if
    return _operandStack;
}//end operandStack

- (void)pushOperand:(double)operand
{
    NSNumber *operandObject = [NSNumber numberWithDouble:operand];
    [self.operandStack addObject:operandObject];
}//end pushOperand

- (double)popOperand
{
    NSNumber *operandObject = [self.operandStack lastObject];//error "Not an objective-c object"
    if(operandObject) [self.operandStack removeLastObject];
    return [operandObject doubleValue];
}//end popOperand

- (double)performOperation:(NSString *)operation
{
    double result = 0;

    if([operation isEqualToString:@"+"]){
    result = [self popOperand] + [self popOperand];
} else if([operation isEqualToString:@"-"]){
    double subtrahend = [self popOperand];
    result = [self popOperand] - subtrahend;
} else if([operation isEqualToString:@"*"]){
    result = [self popOperand] * [self popOperand];
} else if([operation isEqualToString:@"/"]){
    double divisor = [self popOperand];
    if(divisor) result = [self popOperand] / divisor;
}//end if
[self pushOperand:result];
return result;

}//performOperation

@end
4

1 に答える 1

0

これは、関数popOperandの操作順序が正しくないことが原因である可能性があります。私のコメントをインラインで参照してください。最後の行は、すでにリリースされているオブジェクトにアクセスした[operandObjectdoubleValue]を返します。このコードを数回実行すると、メモリの問題が発生し、コメント行にエラーが表示される場合があります。

- (double)popOperand
{
    NSNumber *operandObject = [self.operandStack lastObject];
    if(operandObject) [self.operandStack removeLastObject];
    // When you remove the lastObject(operandObject) from the Array, the operandObject retainCount is zero.
    // Here, the operandObject is deallocated and should not be used.
    // But you call it after it was released.
    return [operandObject doubleValue];
}//end popOperand

popOperandを1回または数回だけ呼び出す場合は、これで問題ない可能性があります。ただし、これによりメモリエラーが発生します。popOperandが呼び出されるたびにエラーが発生するわけではないと思います。これが私の解決策です。

- (double)popOperand
{
    double result = 0.0;
    NSNumber *operandObject = [self.operandStack lastObject];
    if(operandObject) 
    {
        result = [operandObject doubleValue];
        [self.operandStack removeLastObject];
    }
    return result;
}
于 2012-08-03T02:48:07.333 に答える