performSelector用于导致NSInvalidArgumentException的Array中的异类项

时间:2009-08-20 00:35:52

标签: objective-c

我的NSArray拥有两种不同类型的类,这两种类都派生自NSObject并且具有相同名称的方法。如果我打电话:

[myArrayList 
      makeObjectsPerformSelector:@selector(dehydrate) 
      withObject:myParamObjec];

我得到'无法识别的选择器'例外:

  

未被捕获的例外   'NSInvalidArgumentException',原因:   '*** - [BlankItem脱水]:   无法识别的选择器发送到实例   0x10328e0'

如果我遍历'myArrayList'的每个元素并在BlankItem上手动调用'hydrate'作为选择器,同样的事情,但如果我正确投射,一切都没问题。

for (id item in myArray)
{
    if ([item isKindOfClass:[BlankItem class]])
    {
        BlankItem *blankItem = (BlankItem *)item;

        // this works
        [blankItem dehydrate:connectionFactory];

        // this produces the exception
        [item performSelector:@selector(dehydrate) withObject:myParamObjec];
    }
    else
    {
        [item performSelector:@selector(dehydrate) withObject:myParamObjec];
    }
}

班级声明:

@interface BlankItem : NSObject {   
}

- (void)hydrate:(MyParamClass *)paramClass;
@end


@interface RegularItem : NSObject { 
}

- (void)hydrate:(MyParamClass *)paramClass;
@end

这两个类,BlankItem和RegularItem是否需要从公共BaseClass继承才能使其正确?

我没有看到我正在做什么或者没有做到这就产生了这个错误。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

你想要的选择器是dehydrate: - 你离开了冒号,这使得它成为一个完全不同的无冒号选择器。就Objective-C而言,选择者“脱水”和“脱水:”与“杀戮”和“技能”不同。