«Может не отвечать» предупреждение - PullRequest
1 голос
/ 13 мая 2011

Очень специфический вопрос, поэтому проводить исследования по нему довольно сложно.Мне это кажется довольно простым, но я делаю что-то не так и не вижу, что это такое.

Я создал следующий метод:

- (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: ». Кто-нибудь видит, что не так?

Ответы [ 3 ]

3 голосов
/ 30 января 2013

В некоторых случаях это не может быть определено в классах, в этом случае вы можете использовать следующее:

[obj performSelector:@selector(methodName)];

Не предпочтительно, но когда вам это нужно, вам это нужно!:)

1 голос
/ 13 мая 2011

Убедитесь, что этот метод объявлен в вашем @interface !!

0 голосов
/ 13 мая 2011

Это предупреждение обычно означает, что вы забыли объявить метод в интерфейсе объекта, на который указывает ссылка:

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

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

@end

Причина, по которой это предупреждение, а не ошибка, заключается в том, что компилятор жалуется, чтоэто не определенно , что вы можете вызвать этот метод для этого объекта.Объявление @interface - это то, на что смотрит компилятор, чтобы сделать это определение.

Компилятор также знает о методах, которые не были объявлены, но которые определены до их вызова (это применимо только в пределах одного модуля компиляции - в общем, класс может вызывать егособственный метод, у которого нет объявления, без жалоб компилятора, , если реализация метода расположена до его использования в файле (не очень хорошая вещь).

Поиск / разрешение метода выполняется позже, во время выполнения, и компилятор не знает об этом.Поскольку метод действительно существует в вашем классе, вызов в это время завершается успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...