1. ホーム
  2. objective-c

[解決済み] クラス 'test_coredataAppDelegate' の重複したインターフェイス宣言

2022-02-17 13:32:26

質問

このコードで突然2つのエラーが発生しました。 - クラス 'test_coredataAppDelegate' の重複したインターフェース宣言 - struct test_coredataAppDelegate' の再定義。

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

@interface test_coredataAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {

    ///////////////////New parts /////////////////////////
    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;       
    NSPersistentStoreCoordinator *persistentStoreCoordinator;

    //////////////////////////////////////////////
    UIWindow *window;
    UITabBarController *tabBarController;
}
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;

@end

どうすればいいですか?

よろしくお願いします。

解決方法は?

2つの可能性があります。

  • 同じ名前のインターフェイスが2つある。 Xcodeのfind in projectメニューオプションを使用して、以下のインスタンスを探します。 test_coredataAppDelegate . 次に、インターフェースの1つをリネームします。
  • どうにかして、.h ファイルを 2 回インポートすることができました。 常に #import でなく #include .

編集する。

についてもう少し詳しく #import / #include :

#include の場所にあるファイルを盲目的にインクルードします。 #include ステートメントを使用します。 つまり、もしあなたが #include の中に2回ファイルを挿入します。 .m を実行すると、ファイルのコピーが2つ作成されます。 ほとんどすべての伝統的なC #include ファイルには、次のような括弧書きの内容がすべて含まれています。

// some_file.h
#if !defined SOME_FILE_H
#define SOME_FILE_H

//  entire content of #include file

#endif

上記はインクルードガードマクロと呼ばれることもあります。

Objective-Cでは、もし #import を指定すると、コンパイラがそのファイルがまだインポートされていないことを確認するためのチェックが行われます。 その結果、ガードは通常省略されます。ですから、もし #include であるはずのファイルが #import を編集した場合、どちらのチェックも行われず、重複した定義が得られることがあります。