由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'尝试使用appendFormat:'改变不可变对象'

时间:2017-04-02 11:14:30

标签: objective-c

我正在尝试使用控制台线计算器,我的程序出现问题。我调用一个方法(startParsing)并传递用户输入。我的方法在第一次迭代期间工作(当i = 0时)并且它在我的数字属性中添加一个数字(在我的.h文件中是@property(非原子,强)NSMutableString *数字)并且向NSMutableArray添加一个运算符。因此,如果我传递2 + 3 + 7,则该方法将“2”添加到数字属性,将“+”添加到运算符数组。然后第二次迭代开始,当这行被调用时[self.number appendFormat:@“%c”,symbol];出现错误: 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'尝试使用appendFormat:'来改变不可变对象。'。

请你帮我一点,了解什么是错的,以及如何解决它?

- (void)startParsing:(NSMutableString *)userInput {

int operatorCounter = 1;
for (int i = 0; i < [userInput length]; i++)
{
    char symbol = (char) [userInput characterAtIndex:(NSUInteger) i];

    if ([self isSymbolNumber:symbol])
    {
        [self.number appendFormat:@"%c", symbol]; 
        operatorCounter = 0;
    }
    else
    {
        if ([self isOperatorSymbol:symbol])
        {
            //checks if the symbol is a unary operator.
            if ((symbol == '-' || symbol == '+') && ([self isSymbolNumber:(char) [userInput characterAtIndex:(NSUInteger) i + 1]])
                    && (operatorCounter == 1))
            {
                [self.number appendFormat:@"%c", symbol];
                operatorCounter = 0;

            }
            else if (operatorCounter == 0)
            {
                [self convertNumberToIntAndAddToArray:self.number];

                NSMutableString *singleCharacter  = [NSMutableString stringWithFormat:@"%c", symbol];
                [self.arrayOfOperators addObject:singleCharacter];

                operatorCounter++;
            }
            else [self printErrorWith:@"Invalid input operatorCounter == 0 "];
        }
        else
        {
            [self printErrorWith:@"Invalid input operatorCounter == 0 below"];
        }
    }
}

1 个答案:

答案 0 :(得分:1)

首先,使用char作为&#34; characterAtIndex&#34;的结果。太可怕了。 char是8位,characterAtIndex是16位。只要有任何非ASCII字符,事情就会出错。

self.number很可能是一个不可变的字符串(NSString),因此尝试将char附加到它不会起作用。以&#34; stringBy&#34;开头的方法创建并返回一个新字符串;寻找合适的东西。