2012-06-21 92 views
0

我在嘗試實例化單例時遇到了鏈接器命令失敗,退出代碼1(使用-v查看調用)錯誤。在Objective-C中使用Singleton時出現鏈接器錯誤

這是我一直在使用,使我班一個單身的代碼:

.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文件中導入該文件會導致鏈接器錯誤。我很困惑,可能是什麼原因造成的。任何幫助,將不勝感激。

僅供參考,我使用Xcode 4.3.3。是

編輯錯誤的全面意見如下:

LD:重複的符號_MAX_COURSES在../Objects-normal/armv7/CourseEditorViewController.o和... /對象正常/的ARMv7/CourseSelectionViewController .O用於建築的ARMv7 鐺:錯誤:連接命令,退出代碼1失敗(使用-v看到調用)

以上@interface CoursesManager,我已經聲明瞭兩個的const int變量,MAX_COURSES和MAX_HOLES。

+0

能否請您提供錯誤的全部內容? –

+0

當然可以。我剛剛編輯了這個問題。 – rkeller

+0

而這是我的問題。將const int變量更改爲#define修復了鏈接器錯誤。我不確定爲什麼,但我很高興它已經修復。 現在我應該怎麼處理這個問題?保持原樣?去掉它?回答我自己的問題?什麼是這樣的標準程序? – rkeller

回答

0

您是否在執行結束時有@end

您是否正在導入您的CourseManager.h文件中的任何文件?如果是這樣,請確保您導入的文件中沒有任何文件在其中有CourseManager.h的導入語句(即兩個文件相互導入)。

僅供參考,這是推薦的,線程安全的方式來創建一個單:

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

更新

錯誤來是因爲@rkeller被宣告他CourseManager.h文件const int值然後將該.h文件導入到其他幾個文件中。

爲了避免這種情況,有幾件事情可以做:

  1. 開關const int#define
  2. 開關const intstatic const int
  3. 申報CourseManager.h作爲extern const int MyConstant值,然後實例化的價值CourseManager.m像這樣:const int MyConstant = 0;

當您在頭文件中聲明非靜態常量時,編譯器將該常量視爲導入該頭文件的每個文件的獨立全局。然後,當鏈接器嘗試鏈接所有編譯源時,它將遇到全局無數次 - 因此鏈接器錯誤。

+0

是的,我確實在.m文件末尾有@end(必須仔細檢查以確認)。不,我非常努力沒有任何循環包含,所以這不是問題。 感謝關於線程安全創建的提示。 :) – rkeller

0

it seems that simply importing this file in other .m's causes the linker error.

你不能那樣做。你的文件中有一個靜態變量和實現。靜態變量對於鏈接器來說不是問題,因爲你導入的每個.m文件都會有自己的實例cm(不是你想要的),但是你也會得到重複的@implementation這可能是什麼原因造成的鏈接器錯誤。

將接口放入頭文件並隨處導入。該實現和靜態變量分別進入.m文件。

+0

啊,我明白你在說什麼了,但我認爲你的解決方案是基於我在問題中缺乏細節的。 @implementation行及其下面的所有內容都位於CoursesManager的.m文件中。我會編輯它,所以它更有意義。 – rkeller

相關問題