【问题标题】:"May not respond to" warning“可能无法响应”警告
【发布时间】:2011-05-12 20:36:59
【问题描述】:

一个非常具体的问题,因此对其进行研究有点困难。这对我来说似乎很简单,但我做错了什么,我看不到它是什么。

我创建了以下方法:

- (NSComparisonResult) searchBuildingObject:(NSDictionary *) building forString:(NSString *) searchString {

    NSComparisonResult buildingComparison = [[building objectForKey:@"building"] compare:searchString
                                                                                 options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)
                                                                                   range:NSMakeRange(0, [searchString length])];

    if (buildingComparison != NSOrderedSame) {

        for (NSString *alias in [building objectForKey:@"alias"]) {

            NSComparisonResult aliasComparison = [alias compare:searchString
                                                        options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)
                                                          range:NSMakeRange(0, [searchString length])];

            if (aliasComparison == NSOrderedSame)
                return aliasComparison;
        }
    }

    return buildingComparison;

}

它似乎工作正常,即使当我测试该方法时它给了我正确的结果。然而,我在调用该方法时仍然收到警告:

[self searchBuildingObject:[self.buildings objectForKey:building] forString:searchText]

我确定 building 是一个 NSDictionary,而 searchString 绝对是一个 NSString。该方法的结果是一个 NSComparisonResult,然后我将其与 NSOrderedSame 进行比较

NSComparisonResult result = [self searchBuildingObject:[self.buildings objectForKey:building] forString:searchText];
if (result == NSOrderedSame) NSLog(@"Same");

我收到的警告是“BuildingsViewController 可能无法响应 '-searchBuildingObject:forString:'。有人知道出了什么问题吗?

【问题讨论】:

    标签: objective-c ios4


    【解决方案1】:

    在某些情况下,它不能在类中定义,在这种情况下您可以使用以下内容:

    [obj performSelector:@selector(methodName)];
    

    不是首选,但当你需要它时,你需要它! :)

    【讨论】:

      【解决方案2】:

      确保在你的@interface中声明了这个方法!!

      【讨论】:

        【解决方案3】:

        该警告通常表明您忘记在引用对象的接口中声明方法:

        @interface BuildingsViewController : ControllerSuperclass {
               // Declaration of ivars...
        }
        
        - (NSComparisonResult) searchBuildingObject:(NSDictionary *) building forString:(NSString *) searchString;
        // Other method declarations...
        
        @end
        

        这是一个警告而不是错误的原因是编译器抱怨它不是确定您可以在该对象上调用该方法。 @interface 声明是编译器用来做出决定的。

        编译器还知道哪些方法没有声明,但在你调用它们之前定义了(这只适用于单个编译单元——松散地说,一个类可以调用它自己的方法它没有声明,没有编译器抱怨,if 方法的实现位于文件中使用之前;不是一件值得依赖的好东西)。

        方法查找/解析稍后在运行时完成,编译器不知道这一点。因为该方法确实存在于您的类中,所以此时调用成功。

        【讨论】:

        • 啊,我明白了!谢谢。我不明白的一件事是为什么我以前从未收到过这个错误。我之前创建的方法我没有声明(我忘记了,我没有收到错误提醒我),但这是我第一次收到此错误...
        • 可能它们是您刚刚覆盖的超类中的方法?
        • 不太可能,但我想可能,我不记得确切的情况了。我是否传递论点有区别吗?这是我第一个需要参数的方法,所以可能是这样吗?
        • 方法是否有参数没有区别。我不知道为什么会这样,但编译器一定在某处看到了它们的声明。如果您在子类中实现协议或覆盖,则视为声明。
        • “我之前创建了方法,但我没有声明,但这是我第一次得到这个错误......”也许你实现了这些方法以上任何调用他们……
        猜你喜欢
        • 1970-01-01
        • 2011-11-06
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多