Ostrzeżenie" ta deklaracja funkcji nie jest prototypem " w Xcode 9
Podczas używania Xcode 9, istnieją pewne ostrzeżenia kompilatora mówiące This function declaration is not a prototype
. Sugeruje dodanie void
do ciała metody, która ją rozwiąże. Problem, który mam polega na tym, że te ostrzeżenia są również rzucane dla system-API ' s jakUIApplication
delegate-methods:
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler
Można to rozwiązać poprzez:
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)(void))completionHandler
Teraz zastanawiam się, czy metody delegata nadal będą działać na dłuższą metę, czy Apple wstawi void
w późniejszych wersjach Beta iOS 11. Jestem ciekawa, bo jeśli include the void
body, Xcode będzie narzekać na niedopasowanie metody selektorów(co ma sens). Czy ktoś do tej pory doświadczył tego samego problemu?
1 answers
Deklaracja blokowa z pustym nawiasem:
void (^)()
Ma taką samą semantykę jak wskaźnik funkcji z pustym nawiasem:
void (*)()
Nie oznacza to, że nie ma argumentów. Oznacza to, że argumenty nie są podane, dlatego otwiera drogę do błędów, ponieważ można je wywołać w następujący sposób:
void (^block)() = ...
block();
block(10);
block(@"myString");
Przy deklarowaniu bloków bez parametrów zawsze stosuj:
void (^)(void)
Apple nie robiło tego poprawnie wszędzie i prawdopodobnie nie naprawiają to dla starych interfejsów API ze względu na kompatybilność. Będziesz musiał zachować to Ostrzeżenie, dopóki nie przejdziesz do nowszego API.
Możesz również wyłączyć to Ostrzeżenie (-Wstrict-prototypes
):
Or using #pragma
(thanks @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
Zobacz dyskusję LLVM tutaj lub błąd na openradar .
Zauważ, że nie było żadnych zmian w wewnętrznym działaniu API, cały kod nadal będzie działał. Będziemy tylko wiedzieć, że API nie jest tak tak jak powinno być.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-30 08:28:57