0

クラスアプリデリゲートのインターフェイス定義が重複しているため、実行時エラーが発生します。このコードの何が問題なのですか。

#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@end
4

2 に答える 2

0

私はちょうどこの問題に遭遇しました。

私が行ったことは#import AppDelegate、正確に名前が付けられたAppDelegate.h/.mクラスを含む別のプロジェクトからのファイルをドラッグアンドドロップすることでした。ファイルをプロジェクトにドロップしたとき、ファイルをコピーするのではなく、そのプロジェクトから参照しました。

そうすることで、これらのファイルは、AppDelegateがインポートするファイルと競合し、「AppDelegateクラスのインターフェイス定義が重複している」というコンパイルエラーが発生しました。

参照を削除し、意図したとおりにファイルをコピーすることで、問題を解決しました。実行時エラーが発生したため、これは問題ではない可能性がありますが、注意が必要です。

于 2013-02-08T11:30:13.003 に答える
0

ヘッダー ファイルの状態の先頭で:

#if !defined APPDELEGATE_H
#define APPDELEGATE_H

そして最終状態で:

#endif

おそらく、このエラーの根本的な原因は、AppDelegate.h をいくつかのクラスのヘッダー ファイルと .m ファイルに含めたことです。.m ファイルのコンパイル中に、対応する .h ファイルがインクルードされます (おそらく他の .h ファイルもインクルードされます)。これらの .h ファイルのいずれにも、AppDelegate.h が含まれています。さらに、それを .m ファイルに含めます。これにより、コンパイラの観点からインターフェイスの重複定義が発生します。上記の解決策は、実際には解決策ではありません。厳密に言えば回避策です。しかし、それは非常に標準的であり、Apple はすべてのテンプレートでそれを使用しています。問題を解決するのではなく対処するため、これは単なる回避策です。

適切な解決策は次のとおりです。回避できる場合は、.h ファイルに他の .h ファイルを含めないでください。@class適切な場合は statementmenstを使用してください。.h ファイルが他のインクルードされた .h ファイルのいずれかに既にインクルードされている場合、.m ファイルに .h ファイルのインクルードを繰り返さないでください。「これは面倒だな……」と思うかもしれません。そして、あなたは正しいです:)したがって#if !defined XY_H / #define XY_H / #endif、これは単なる回避策であると信じていますが、一般的なパターンを使用することをお勧めします。

#if !defined APPDELEGATE_H
#define APPDELEGATE_H
#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@end
#endif
于 2013-02-08T10:20:36.733 に答える