duplicate symbol是一種常見的連接錯誤,不像編譯錯誤那樣能夠直接定位到問題的所在。可是通過一段時間的總結,發現這種錯誤老是有一些規律能夠找的。
例如,咱們有以下的最簡單的兩個類代碼:
// ClassA.h
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end
// ClassA.m
#import "ClassA.h"
@implementation ClassA
@end
// ClassB.h
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end
// ClassB.m
#import "ClassB.h」
@implementation ClassB
@end
編譯後出現的錯誤信息以下:
duplicate symbol _OBJC_METACLASS_$_ClassA in:
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.o
duplicate symbol _OBJC_CLASS_$_ClassA in: /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.old: 2
duplicate symbols for architecture i386clang:
error: linker command failed with exit code 1 (use -v to see invocation)
從上面出現問題的地方,咱們應該能推測出是ClassA這個類出了問題。若是這個類是咱們本身寫的,就容易辦一些。
能夠考慮如下緣由:
1.引入頭文件時,因爲疏忽,誤引入.m文件。這種通常仔細檢查一下出現問題的類的源文件就能發現。
例:ClassB.m 文件修改爲下面這樣
#import "ClassB.h>"
#import "ClassA.m」 // 這句話有問題
@implementation ClassB
@end
2.同一個類,實現兩次,即有兩個@implementation 。這種通常會有一個警告,也比較容易發現。
例:ClassB.m文件修改爲下面這樣:
// ClassB.m
#import "ClassB.h」
@implementation ClassB
@end
@implementation ClassA
@end
3.工程文件,同一個類文件被引入了兩次,引發這種錯誤的緣由大概有兩種:一是多人協做開發時,致使project文件合併衝突;二是同名文件不在同一目錄下,添加到工程時形成重複添加。 這種通常在文件視圖,用名字過濾器檢查一下就發現了。
4. Targets的Build Phase設置項裏,查看Complie Sources這一項,看看出現問題的類是否是有重複的,用文件名過濾也比較容易發現。這種問題通常也是多人協做開發時,project文件衝突致使的。發現這種問題,只要刪除就能夠了。不過在我解決問題過程當中,刪除其中一個文件時,重複文件會自動所有刪除,因此還須要單獨添加一下。
5.若是咱們的工程中引用了第三方的庫,而剛好第三方的庫裏面有一個ClassA,也會出現這種問題。若是不能修改第三方的庫代碼,只能修改我信本身的代碼了。iphone
待完善ui