#objective-c #ios4
#objective-c #ios4
Вопрос:
Очень специфический вопрос, поэтому провести исследование по нему довольно сложно. Мне это кажется довольно простым, но я делаю что-то не так и не могу понять, что именно.
Я создал следующий метод:
- (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:’. Кто-нибудь видит, что не так?
Ответ №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
Объявление — это то, на что смотрит компилятор, чтобы сделать это определение.
Компилятор также знает о методах, которые не были объявлены, но которые определены перед их вызовом (это применимо только в пределах одного модуля компиляции — грубо говоря, класс может вызвать свой собственный метод, у которого нет объявления, без жалоб компилятора, если реализация метода находится в файле до его использования; не на что полагаться).
Поиск / разрешение метода выполняется позже, во время выполнения, и компилятор не знает об этом. Поскольку метод действительно существует в вашем классе, вызов завершается успешно в это время.
Комментарии:
1. Ах, теперь я понимаю! Спасибо. Однако я не понимаю, почему я никогда раньше не получал эту ошибку. До этого я создавал методы, которые не объявлял (я забыл, и я не получал напоминания об ошибке), но это первый раз, когда я получаю эту ошибку…
2. Возможно, это были методы из суперкласса, которые вы только что переопределили?
3. Маловероятно, но я предполагаю, что возможно, я больше не помню точных ситуаций. Имеет ли значение, передаю я аргументы или нет? Это был мой первый метод, который требовал аргументов, так что, возможно, это могло быть так?
4. Наличие у метода параметров не имеет значения. Я не знаю, почему это произошло, но компилятор, должно быть, где-то видел объявление для них. Если вы реализуете протоколы или переопределяете в подклассе, это считается объявлением.
5. «Я создавал методы до этого, которые я не объявлял, но это первый раз, когда я получаю эту ошибку …» Возможно, вы внедрили эти методы выше любых обращений к ним…