Почему выполняется: метод withObject не найден? - PullRequest
3 голосов
/ 30 марта 2011

Я хочу исправить предупреждения в коде моего приложения.У меня есть AddressBookModel.h, который реализует протокол TTModel .

В ответе на этот вопрос вы найдете как интерфейс, так и реализацию AdressBookModel.Именно так я это и реализовал Как использовать Three20 TTMessageController?

Однако для

[_delegates perform:@selector(modelDidStartLoad:) withObject:self];

и некоторых других подобных селекторов я получаю предупреждения типа

Method -perform:withObject not found (return type defaults to id)

Поскольку _delegates - это массив

- (NSMutableArray*)delegates {
    if (!_delegates) {
        _delegates = TTCreateNonRetainingArray();
    }
    return _delegates;
}

, некоторые предлагают использовать makeObjectsPerformSelector, но это дает мне исключение unrecognized selector sent to instance.

Вот исходный код TTModel: http://api.three20.info/protocol_t_t_model-p.php

Почему выполняет: withObject отсутствует?Является ли performSelector:withObject альтернативой (мое приложение вылетает при его использовании)?

Ответы [ 4 ]

5 голосов
/ 30 марта 2011

_delegates - массив делегата с . Это не настоящий делегат, как видно из названия, которое находится во множественном числе. Массив не отвечает на метод -modelDidFinishLoad: - его элементы делают.

Вам нужно вынуть каждый элемент из массива и вызвать метод их, например,

for (id<TTModelDelegate> delegate in _delegates)
   [delegate modelDidFinishLoad:self];

или даже проще, используя NSArray's -makeObjectsPerformSelector:…:

[_delegates makeObjectsPerformSelector:@selector(modelDidFinishLoad:)
                            withObject:self];
2 голосов
/ 07 апреля 2011

execute: withObject: метод, который выдает это предупреждение, определен в категории NSArray (TTCategory) в файле NSArrayAdditions.h в среде Three20.Вы должны убедиться, что этот заголовок правильно импортирован / на него ссылается компилятор, т.е. вам нужно посмотреть на импорт этого конкретного заголовка или проверить конфигурацию интеграции Three20.

Вам не нужно менять этот метод на makeObjectsPerformSelector: так как это просто проблема импорта (ваш код работает нормально, но выдает только предупреждения компиляции).

1 голос
/ 30 марта 2011

Читая между строк, похоже, что вы хотите, чтобы объекты, которые в вашем _delegates массиве, выполняли определенный селектор. Вам нужно позвонить -makeObjectsPerformSelector:withObject: так:

[_delegates makeObjectsPerformSelector: @selector(modelDidCancelLoad:) withObject: self];
0 голосов
/ 30 марта 2011

Вы ошибаетесь modelDidCancleLoad: должно быть modelDidCancelLoad:

'NSInvalidArgumentException', reason:
'-[__NSCFArray modelDidCancleLoad:]: unrecognized selector
 sent to instance 0x24f480'

Убедитесь, что ваши _delegates - это то, чего вы ожидаете. Кажется, это NSArray.

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