0

シングルトンをインスタンス化しようとすると、リンカーコマンドが終了コード1(-vを使用して呼び出しを確認)エラーで失敗します。

クラスをシングルトンにするために使用しているコードは次のとおりです。

.h

@interface CoursesManager : NSObject
{

}
+ (id)SharedInstance;
@end

.m

@implementation CoursesManager

+ (id)SharedInstance
{
     static dispatch_once_t once;
     static id sharedInstance;
     dispatch_once(&once, ^{
     sharedInstance = [[self alloc] init];
     });

     return sharedInstance;
}
@end

そして、これは私が他のクラスでそれを使用している方法です:

coursesManager = [CoursesManager SharedInstance];

もう少し調べてみると、このファイルを他の.mにインポートするだけで、リンカーエラーが発生するようです。私はこれを引き起こしている可能性があるものについてかなり混乱しています。どんな助けでもいただければ幸いです。

参考までに、Xcode4.3.3を使用しています。

エラーの完全なコメントを編集するのは次のとおりです。

ld:../Objects-normal/armv7/CourseEditorViewController.oおよび... / Objects-normal / armv7 / CourseSelectionViewController.oのアーキテクチャarmv7のシンボル_MAX_COURSESが重複していますclang:エラー:リンカーコマンドが終了コード1で失敗しました(-vを使用)呼び出しを確認するには)

@interface CoursesManagerの上で、2つのconst int変数、MAX_COURSESとMAX_HOLESを宣言しました。

4

2 に答える 2

0

@end実装の最後にありますかCourseManager.m

ファイルにファイルをインポートしていCourseManager.hますか?その場合は、インポートするファイルのいずれにもインポートステートメントが含まれていないことを確認してCourseManager.hください(つまり、2つのファイルが相互にインポートします)。

参考までに、これはシングルトンを作成するための推奨されるスレッドセーフな方法です。

+ (id)sharedInstance
{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

アップデート

このエラーは、@ rkellerがconst intCourseManager.hファイルで値を宣言し、その.hファイルを他のいくつかのファイルにインポートしていたために発生しました。

これを回避するために、できることがいくつかあります。

  1. const intに切り替える#define
  2. const intに切り替えるstatic const int
  3. で値を宣言してCourseManager.hから、次のようextern const int MyConstant に値をインスタンス化します。CourseManager.mconst int MyConstant = 0;

ヘッダーファイルで非静的定数を宣言すると、コンパイラはその定数を、そのヘッダーファイルをインポートする各ファイルの独立したグローバルとして扱います。次に、リンカがコンパイルされたすべてのソースをリンクしようとすると、グローバルに何度も遭遇するため、リンカエラーが発生します。

于 2012-06-21T21:01:21.507 に答える
0

このファイルを他の.mにインポートするだけで、リンカーエラーが発生するようです。

あなたはそれをすることはできません。ファイルには静的変数と実装が含まれています。静的変数はリンカーにとって問題ではありません。インポートするすべての.mファイルには独自のインスタンスがありますがcm(必要なものではありません)、重複@implementationしたsも取得されるため、リンカーの原因である可能性があります。エラー。

インターフェイスをヘッダーファイルに入れて、どこにでもインポートします。実装と静的変数は別の.mファイルに入れられます。

于 2012-06-21T21:12:58.553 に答える