2011-05-12 147 views
1

一个非常具体的问题,因此对其进行研究很困难。这对我来说似乎很简单,但我做错了什么,我看不到它是什么。“可能不会回应”警告

我创建了以下方法:

- (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] 

我确信建筑是一个NSDictionary,并搜索字符串绝对是一个NSString。该方法的结果是NSComparisonResult然后我比较NSOrderedSame

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

我得到的是“BuildingsViewController可能不响应警告‘-searchBuildingObject:forString:’任何人都不会看到有什么不对

回答

0

宣称,通常警告表明您已经忘记申报方法的接口的引用的目标:

@interface BuildingsViewController : ControllerSuperclass { 
     // Declaration of ivars... 
} 

- (NSComparisonResult) searchBuildingObject:(NSDictionary *) building forString:(NSString *) searchString; 
// Other method declarations... 

@end 

这是一个警告,而不是错误的原因是,它的编译器抱怨,这不是一定,你可以调用该对象的这个方法。声明是编译器所做的决定。

编译器也知道这是没有申报的方法,但其定义你叫他们之前(这仅适用于单一的编译单元内 - 严格地讲,一个类可以调用它自己的方法,该方法不有一个声明,没有编译器的抱怨,如果该方法的实现位于其在文件中的使用之前,而不是一个伟大的事情依靠)。

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

+0

啊,我明白了!谢谢。有一件事我不明白,为什么我以前从来没有得到过这个错误。我之前创建了方法,我没有声明(我忘了,我没有得到一个错误提醒我),但这是我第一次得到这个错误... – 2011-05-12 20:53:16

+0

可能他们是来自超类的方法,你只是压倒? – 2011-05-12 20:55:35

+0

不太可能,但我想可能,我不记得确切的情况了。无论我是否通过论证,它都会有所作为吗?这是我第一个需要参数的方法,所以也许可能是这样吗? – 2011-05-12 20:59:29

1

确保此方法是在你的@interface

1

在某些情况下,它不能在类中定义在这种情况下,你可以使用以下命令:

[obj performSelector:@selector(methodName)]; 

不理想,但是当你需要它,你需要它! :)

相关问题