-[__NSArrayI replaceObjectAtIndex:withObject:]: 无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】-[__NSArrayI replaceObjectAtIndex:withObject:]: 无法识别的选择器发送到实例【英文标题】:-[__NSArrayI replaceObjectAtIndex:withObject:]: unrecognized selector sent to instance 【发布时间】:2012-08-03 00:44:53 【问题描述】:

我有一个 Mutable NSArray 存储对象类型(ids - NSNumber、NSString),它将存储数字(1、2、3、4 等)、操作(+、-、/、* 等),和变量(x、y、z 等)。我将变量和相关值存储在 NSDictionary 中,键是等于 x、y、z 的 NSString,NSNumber 值分别为 5、5、2。我想用存储在我的 NSDictionary 中的实际值替换我的 NSArray 中的变量。尝试替换对象时,我不断收到以下错误。请帮忙。

        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】:

NSArray 的copy 方法总是返回一个不可变数组,不管原始数组是可变的还是不可变的。如果你想要一个可变副本,你需要使用mutableCopy。 (这是 Cocoa 的约定。NSString、NSDictionary 以及通常具有可变和不可变变体的任何类都将以相同的方式工作。)

【讨论】:

当。我没有在任何地方读过。我无法告诉你我花了多少时间试图找出一个简单的事实。谢谢一百万伙计。 @5lbBass:如果您需要查找它,它位于文档中的几个不同位置。例如,来自 NSCopying 文档:“如果考虑‘不可变与可变’适用于接收对象,则返回的副本是不可变的”

以上是关于-[__NSArrayI replaceObjectAtIndex:withObject:]: 无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章