【问题标题】:selector syntax: why I am getting unrecognized selector error?选择器语法:为什么我收到无法识别的选择器错误?
【发布时间】:2014-06-04 07:02:27
【问题描述】:

我有一个比较两个对象的方法:

- (NSComparisonResult)compare:(NSObject *)object1 to:(NSObject *)object2{
    // do some stuff
    return NSOrderedSame; // or NSOrderedAscending or NSOrderedDescending
}

这个方法被这样调用:

NSArray *sortedSyncedAufgaben = [syncedAufgabe sortedArrayUsingSelector:@selector(compare:to:)];

现在,当我在我的 iPhone 上运行它时,选择器所在的行中会出现“无法识别的选择器错误”:

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[ImpfVorgang compare:to:]: unrecognized selector sent to instance 0x14ebf040”

怎么了?我以为每个参数都需要一个冒号?

【问题讨论】:

  • 我们能看到整个错误信息吗?
  • 该方法在哪里定义? syncedAufgabe 是哪个类的实例?
  • @JoshCaswell 是的,在同一个类/视图控制器中
  • @NobodyNada *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ImpfVorgang compare:to:]: unrecognized selector sent to instance 0x14ebf040'
  • @mradlmaier compare:to: 是否在 ImpfVorgang.m 中定义?

标签: ios objective-c selector


【解决方案1】:

sortedArrayUsingSelector: 尝试将选择器应用于比较左侧的对象,而不是调用sortedArrayUsingSelector: 的类。换句话说,如果选择器存在于您启动排序的类中,而不是存在于NSArray 内的对象类中(即不在您的ImpfVorgang 类中),您将看到“无法识别的选择器错误”。

您可以更改代码以手动应用选择器,如下所示:

NSArray * sortedSyncedAufgaben = [syncedAufgabe sortedArrayUsingComparator:^(NSObject *a, NSObject* b) {
    return [self compare:a to:b];
}];

或者,您可以将比较逻辑移到比较器块中,并完全放弃 compare:to: 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-23
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多