it-swarm.com.de

"Diese Funktionsdeklaration ist kein Prototyp" Warnung in Xcode 9

Bei der Verwendung von Xcode 9 werden einige Compiler-Warnungen angezeigt, die This function declaration is not a prototype. Es wird empfohlen, void zum Methodentext hinzuzufügen, um das Problem zu beheben. Das Problem, das ich habe, ist, dass diese Warnungen auch für System-APIs wie UIApplication delegate-methods ausgegeben werden:

- (void)application:(UIApplication *)application
    handleActionWithIdentifier:(NSString *)identifier
         forRemoteNotification:(NSDictionary *)userInfo
              withResponseInfo:(NSDictionary *)responseInfo
             completionHandler:(void (^)())completionHandler

Dies könnte folgendermaßen gelöst werden:

- (void)application:(UIApplication *)application
    handleActionWithIdentifier:(NSString *)identifier
         forRemoteNotification:(NSDictionary *)userInfo
              withResponseInfo:(NSDictionary *)responseInfo
             completionHandler:(void (^)(void))completionHandler

Jetzt frage ich mich, ob die Delegate-Methoden langfristig noch funktionieren werden oder ob Apple in späteren iOS 11 Beta-Versionen das void einfügen wird Im Body void wird sich Xcode über nicht übereinstimmende Methodenselektoren beschweren (was Sinn macht). Hat jemand das gleiche Problem bisher erlebt?

109
Hans Knöchel

Die Blockdeklaration mit leerer Klammer:

void (^)()

hat die gleiche Semantik wie ein Funktionszeiger mit leerer Klammer:

void (*)()

Das heißt nicht, dass es keine Argumente gibt. Dies bedeutet, dass die Argumente nicht angegeben sind, und bietet daher die Möglichkeit, Fehler zu beheben, da Sie sie folgendermaßen aufrufen können:

void (^block)() = ...
block();
block(10);
block(@"myString");

Wenn Sie Blöcke ohne Parameter deklarieren, verwenden Sie immer:

void (^)(void)

Apple hat das nicht überall richtig gemacht und sie haben das wahrscheinlich aus Kompatibilitätsgründen nicht für alte APIs behoben. Sie müssen diese Warnung dort aufbewahren, bis Sie zur neueren API wechseln.

Sie können diese Warnung auch deaktivieren (-Wstrict-prototypes): enter image description here

oder mit #pragma (danke @ 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

Siehe die LLVM-Diskussion hier oder den Bug on openradar .

Beachten Sie, dass sich an der internen Funktionsweise der APIs nichts geändert hat. Der gesamte Code funktioniert weiterhin. Wir werden nur wissen, dass die API nicht so gut ist, wie sie sein sollte.

236
Sulthan