一个非常具体的问题,所以对它进行研究有点难。对我来说这似乎很简单,但我做错了什么,我看不出它是什么。
我创建了以下方法:
- (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:'。有人看到了什么问题吗?
答案 0 :(得分:3)
在某些情况下,它无法在类中定义,在这种情况下,您可以使用以下内容:
[obj performSelector:@selector(methodName)];
不是首选,但是当您需要它时,您需要它! :)
答案 1 :(得分:1)
确保在@interface
!!
答案 2 :(得分:0)
该警告通常表示您忘记在引用对象的界面中声明该方法:
@interface BuildingsViewController : ControllerSuperclass {
// Declaration of ivars...
}
- (NSComparisonResult) searchBuildingObject:(NSDictionary *) building forString:(NSString *) searchString;
// Other method declarations...
@end
它是一个警告而不是错误的原因是编译器抱怨它不是某些你可以在该对象上调用该方法。 @interface
声明是编译器查看的结果。
编译器也知道未声明的方法,但是在调用它们之前定义的(这只适用于单个编译单元 - 松散地说,类可以调用自己的方法)没有编译器抱怨的情况下没有声明,如果方法的实现位于文件中使用之前;不是很好的依赖)。
方法查找/解析稍后在运行时完成,编译器不知道这一点。因为该方法确实存在于您的类中,所以此时调用成功。