[解決済み] Xcode 9で「この関数宣言はプロトタイプではありません」という警告が表示される。
質問
Xcode 9を使用しているとき、以下のようなコンパイラの警告が表示されることがあります。
This function declaration is not a prototype
. これは
void
を追加することを提案し、それを解決します。私が抱えている問題は、これらの警告が、次のようなシステムAPIに対しても投げられることです。
UIApplication
delegate-methodsのようなシステム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 Beta の後のバージョンで挿入するのでしょうか。私が気になっているのは、もし
void
ボディを含めると、Xcodeはmismatching method-selectorsについて文句を言うからです(これは理にかなっています)。誰かがこれまでに同じ問題を経験しましたか?
どのように解決するのですか?
ブロック宣言に空白の括弧がある。
void (^)()
は、空白の括弧を持つ関数ポインタと同じ意味を持ちます。
void (*)()
引数がないわけではありません。引数が指定されていないということなので、以下のような呼び方ができるため、バグへの道が開かれることになります。
void (^block)() = ...
block();
block(10);
block(@"myString");
パラメータを持たないブロックを宣言する場合は、必ず
void (^)(void)
Appleはどこでもそれを正しく行っていたわけではなく、互換性の理由から古いAPIについてはおそらく修正していないでしょう。新しい API に移行するまでは、その警告をそこに表示しておく必要があります。
また、この警告をオフにすることもできます (
-Wstrict-prototypes
):
または
#pragma
(ありがとうございます
デービッド・パスドク
):
#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の議論を参照してください。 ここで にあるバグを参照してください。 オープンレーダー .
APIの内部動作に変更がないため、すべてのコードが動作することに注意してください。私たちが知ることができるのは、APIが本来あるべき姿ではないことだけです。
関連
-
[解決済み】Xcode - 'NSUnknownKeyException', reason: ... this class is not key value coding-compliant for the key X" エラーの修正方法とは?
-
[解決済み] Xcodeエラー "Could not find Developer Disk Image" が発生する。
-
[解決済み] このアクションは完了できませんでした。再試行 (-22421)
-
[解決済み] Objective-Cで文字列が空かどうかをテストするにはどうすればよいですか?
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] 'ld: 警告: オプションに対応するディレクトリが見つかりません'
-
[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)
-
[解決済み] Xcodeの警告。"出力ファイルに対する複数のビルドコマンド"
-
[解決済み] 16進カラーバリューの使用方法
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
制御が非ボイド関数の終了に達する
-
XCode のコンパイル例外を解決する clang: error: linker command failed with exit code 1
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] App Storeのアプリと連動させる方法
-
[解決済み] Xcode 12、iOS Simulator用にビルドしても、iOS用にビルドされたオブジェクトファイルでは、アーキテクチャ「arm64」用にリンクされます。
-
[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)
-
[解決済み] iOS - UITextFieldの外側をタッチするとキーボードが外れる。
-
[解決済み] SwiftでURLから画像を読み込む/ダウンロードする
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?