«Может не отвечать на» предупреждение

#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. «Я создавал методы до этого, которые я не объявлял, но это первый раз, когда я получаю эту ошибку …» Возможно, вы внедрили эти методы выше любых обращений к ним…