-[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance -[__NSArrayI replaceObjectAtIndex:withObject:]:未识别的选择器发送到实例

3
我有一个可变的NSArray,存储对象类型(NSNumber、NSString),可以存储数字(1、2、3、4等)、运算符(+、-、/、*等)和变量(x、y、z等)。我已经将变量及其相关值存储在NSDictionary中,键为NSString,分别等于x、y、z,对应的NSNumber值为5、5、2。我想用NSDictionary中存储的实际值替换NSArray中的变量。然而,在尝试替换对象时,我一直收到以下错误。请帮忙解决。
-[__NSArrayI replaceObjectAtIndex:withObject:]: 无法识别的选择子发送给实例
        NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
                              [NSNumber numberWithDouble:5],@"x",  
                              [NSNumber numberWithDouble:5],@"y", 
                              [NSNumber numberWithDouble:2],@"z", 
                              nil];

+ (double)runProgram:(id)program
 usingVariableValues:(NSDictionary *)variableValues;
{
    // introspection - ensure program is NSArray and variableValues is NSDictionary
    if ([program isKindOfClass:[NSArray class]] && [variableValues isKindOfClass:    [NSDictionary class]])
    {
        // array for program stack
        NSMutableArray *stack = [program copy];

        // Loop to replace variables with actual values in NSDictionary
        for (NSUInteger i = 0; i < [stack count]; i++)
        {
            NSLog(@"object at index = %@", [stack objectAtIndex:i]);
        if ([[stack objectAtIndex:i] isKindOfClass:[NSString class]] && [[stack     objectAtIndex:i] isEqualToString: @"x"])
            {
                 // replace variable with value in corresponding value in dictionary
                NSNumber *numberKeyValue = [variableValues objectForKey:@"x"];
                [stack replaceObjectAtIndex:i withObject:numberKeyValue];
            }
        }
return 0
}
1个回答

10

无论原来的 NSArray 是否可变,NSArray 的 copy 方法始终返回一个不可变数组。如果你需要一个可变副本,你需要使用 mutableCopy 方法。(这是 Cocoa 惯例。NSString、NSDictionary 和通常任何有可变和不可变变体的类都遵循同样的方式。)


哎呀,我没在任何地方看到过这个信息。我无法告诉你我为此浪费了多少时间。太感谢你了,伙计。 - 5lb Bass
@5lbBass:如果你需要查找它,它在文档的几个不同位置中都有提到。例如,在NSCopying文档中:“如果考虑到‘不可变 vs. 可变’的情况,则返回的副本是不可变的。” - Chuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接