Получение Xcode, чтобы сбросить предупреждение «Не найден метод XXX» при делегировании - PullRequest
5 голосов
/ 30 сентября 2009

Это может быть я неправильно делаю шаблон дизайна.

Я реализую асинхронное делегирование в приложении, которое использует NSURLConnection. Объект оборачивает NSURLConnection и обрабатывает его делегированные сообщения; это отлично работает Теперь я определяю своих собственных делегатов в объекте, который его использует (NSURLConnection messages ConnectionWrapper, ConnectionWrapper messages NeedsToUseConnection, вы понимаете), и это работает также хорошо, однако Xcode выдает это предупреждение:

Не найден метод '-request: finishWithResult'

Это, по-видимому, потому что я объявляю делегата, которого я называю, следующим образом:

id<NSObject> delegate;

... и Xcode проверяет, что NSObject объявляет в платформе Foundation. Моего пользовательского сообщения о делегате нет. Я правильно изолирую звонок:

if([delegate respondsToSelector:@selector(request:finishedWithResult:)])
    [delegate request:self finishedWithResult:ret];

Помимо выключения предупреждения - мне нравится работать с как можно большим количеством предупреждений - есть ли способ сообщить (синтаксически или через директиву компилятора), что я знаю, что это сообщение не объявлено? Должен ли я вместо этого использовать шаблон дизайна интерфейса для этого Java? Используя id<WillReceiveRequestMessages> или что-то?

Открыто для предложения.

Ответы [ 2 ]

10 голосов
/ 30 сентября 2009

Лучший способ сделать это - создать собственный протокол делегирования:

@protocol MyControlDelegate <NSObject>

@optional
- (void)request:(MyControl *)request didFinishWithResult:(id)result;

@end

Тогда вы бы объявили своего делегата следующим образом:

id <MyControlDelegate> delegate;

Компилятор больше не будет жаловаться, когда вы напишите:

if ([delegate respondsToSelector:@selector(request:didFinishWithResult:)])
    [delegate request:self didFinishWithResult:result];

Синтаксис <NSObject> важен в определении протокола, потому что он говорит компилятору включить протокол NSObject. Вот как ваш протокол получает такие методы, как respondsToSelector:. Если вы пропустите это, компилятор начнет жаловаться на respondsToSelector:.

0 голосов
/ 24 января 2012

Это, по-видимому, потому что я объявляю делегата, которому я звоню как это: ... и Xcode проверяет, что NSObject объявляет в Фундаментная основа.

Это неверно. Если бы это было так, вы бы получили предупреждение о том, что объект «может не отвечать» на метод или что-то в этом роде. Это совершенно отдельная проблема.

Это предупреждение связано с тем, что компилятор должен знать сигнатуру селектора, чтобы вызвать его. Это происходит потому, что за кулисами компилятор переводит вызов метода в objc_msgSend или objc_msgSend_stret в зависимости от того, возвращает ли метод тип struct или нет. Если он не знает тип возвращаемого значения, он будет догадываться, что это не struct, и будет использовать первую функцию. Тем не менее, это может быть неправильно.

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

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