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?

Author: Bilal, 2017-06-10

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): Tutaj wpisz opis obrazka

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ć.

 210
Author: Sulthan,
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