【问题标题】:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with appendFormat:'由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试使用 appendFormat 改变不可变对象:”
【发布时间】:2017-04-02 11:14:29
【问题描述】:

我正在尝试做一个控制台行计算器,但我的程序有问题。我调用一个方法(startParsing)并传递一个用户输入。我的方法在第一次迭代期间起作用(当 i=0 时),它将一个数字添加到我的数字属性(这是 @property (nonatomic, strong) NSMutableString *number; 在我的 .h 文件中)并向 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"];
        }
    }
}

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    首先,对“characterAtIndex”的结果使用 char 实在是太糟糕了。 char 是 8 位,characterAtIndex 是 16 位。只要有任何非 ASCII 字符,事情就会大错特错。

    self.number 很可能是一个不可变字符串 (NSString),因此尝试向其附加 char 是行不通的。以“stringBy”开头的方法创建并返回一个新字符串;寻找合适的东西。

    【讨论】:

    • 感谢您的回答。所以如果你认为 self.number 是一个不可变的字符串,我怎样才能让它可变呢?当我声明它时,它是一个 NSMutable 字符串。我不太明白你的意思是使用 stringBy 的方法。我需要在文档中找到合适的方法吗?
    • @splean stringWithFormat 将返回一个不可变的字符串,而不是像 {[NSMutableString stringWithFormat:@"%c", symbol] mutableCopy] 那样使用它
    • @gnasher729 你能看看我的评论吗?谢谢。
    猜你喜欢
    • 2018-04-05
    • 2013-04-27
    • 2021-09-17
    • 2012-07-12
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多