Категория может одновременно реализовать протокол?

3.6.1 Основных функций

....

2 реализация не должна предопределять эти main функция. Эта функция не должна быть перегружена. Это должно иметь тип возврата типа int, но иначе его тип определяется реализацией. Все реализации должны позволить оба из следующих определений основного:

int main() { /* ... */ }

и

int main(int argc, char* argv[]) {
/* ... */
}

.... и это продолжает добавлять...

5 А return оператор в main имеет эффект отъезда основной функции (уничтожающий любые объекты с продолжительностью автоматического хранения) и звонящий exit с возвращаемым значением как аргумент. , Если управление достигает конца main, не встречаясь с оператором возврата, эффект является эффектом выполняющегося возврата 0 ;

попытка найти копию онлайн стандарта C++, таким образом, я мог заключить этот отрывок в кавычки, я нашел сообщение в блоге, которое заключает все правильные биты в кавычки лучше, чем, я мог.

27
задан smorgan 2 November 2009 в 14:03
поделиться

3 ответа

Обходной путь - объявить протокол в категории без реализации и реализовать метод в другой категории, например:

@interface NSObject (SomeCategory) <SomeDelegate>
  - (void)someDelegateMessage;    
@end

@implementation NSObject (SomeCategory_Impl)
  - (void)someDelegateMessage {}
@end

Если вы сделаете это, NSObject будет считаться соответствующим во время компиляции, и во время выполнения проверки для someDelegateMessage пройдут успешно. Тем не менее, corresToProtocol: проверки времени выполнения завершатся неудачно.

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

13
ответ дан 28 November 2019 в 05:51
поделиться

Есть ли шанс, что ваше объявление протокола включает протокол NSObject ? Примерно так:

@protocol SomeDelegate <NSObject>
...

Вот откуда приходят предупреждения, потому что теперь ваша категория не реализует полный протокол. В коде теста, который я только что набрал, удаление NSObject из протокола удаляет предупреждения компилятора.

5
ответ дан 28 November 2019 в 05:51
поделиться

If you want the compiler to shut up about sending messages (and its important that you remember that thats the protocol name, not the class name) then just use 'id' variables, not 'id' since thats you explicitly telling the compiler "This is an object which only implements the SomeDelegate protocol".

Alternately, use NSObject as your variable type instead.

1
ответ дан 28 November 2019 в 05:51
поделиться