"Эта декларация функции не является прототипом" предупреждение в Xcode 9
при использовании Xcode 9, есть некоторые предупреждения компилятора говоря This function declaration is not a prototype. Это говорит о том, чтобы добавить void к телу метода,который разрешит его. Проблема, с которой я сталкиваюсь, заключается в том, что эти предупреждения также выбрасываются для system-API, например UIApplication делегат-методы:
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler
это можно решить следующим образом:
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)(void))completionHandler
теперь мне интересно, будут ли методы делегата по-прежнему работать на долгосрочной основе или Apple вставит void в более поздних бета-версиях iOS 11. Мне любопытно, потому что если я включаю void тело, Xcode будет жаловаться на несоответствие метод-селекторы (что имеет смысл). Кто-то испытывал ту же проблему до сих пор?
1 ответ:
объявление блока с пустой скобкой:
void (^)()имеет ту же семантику, что и указатель функции с пустой скобкой:
void (*)()это не значит, что нет аргументов. Это означает, что аргументы не заданы, поэтому он открывает путь к ошибкам, так как вы можете вызвать ее следующим образом:
void (^block)() = ... block(); block(10); block(@"myString");при объявлении блоков без параметров всегда используйте:
void (^)(void)Apple не делала это правильно везде, и они, вероятно, не исправляют это для старых API по причинам совместимости. Вам нужно будет сохранить это предупреждение там, пока вы не перейдете к новому API.
вы также можете отключить это предупреждение (
-Wstrict-prototypes):или через
#pragma(спасибо @davidisdk):#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wstrict-prototypes" - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler { } #pragma clang diagnostic popсмотрите обсуждение LLVM здесь или на openradar.
обратите внимание, что никаких изменений в внутренняя работа API, весь код будет по-прежнему работать. Мы будем только знать, что API не так хорош, как это должно быть.
