Xcode 9の「この関数宣言はプロトタイプではありません」の警告


119

Xcode 9を使用する場合、コンパイラの警告がいくつか表示されますThis function declaration is not a prototypevoidメソッド本体に追加することを提案し、それを解決します。私が抱えている問題は、これらの警告がUIApplicationデリゲートメソッドのようなシステムAPIに対してもスローされることです。

- (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がメソッドセレクターの不一致(これは理にかなっています)について文句を言うので、私は興味があります。これまでに誰かが同じ問題を経験しましたか?

回答:


251

括弧が空のブロック宣言:

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が本来あるべきほど良くないことを知っているだけです。


5
プラグマを使用して、iOS APIを実装するときの警告を削除することもできます。 (NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler {#pragma clang diagnostic pop
davidisdk 2017年

1
JBChartView APIを使用して、これらの警告を約20件取得しました。彼らはスウィフト4用の更新を決定するまで、それらをオフにすることができるようにすることのnice
エジソン

7
@tymacこれはobjc警告です。Swiftとは関係ありません。
スルタン2017

>「パラメーターのないブロックを宣言するときは、常に(void)を使用してください」<コードのように見えるものを追加できますか?代替として、void (^)()またはvoid (*)()
pkamb

2
@pkambブロックがパラメーターを取らない場合(つまりvoid(^)())、void括弧内に明示的に含めますvoid(^)(void)
ベン株
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.