2010-08-14 42 views
22

操作員級:的iOS編程 - 重複符號_OBJC_IVAR

#import <Foundation/Foundation.h> 


@interface operator : NSObject { 

int number; 
} 

@property int number; 

@end 

@implementation operator 

- (id)init{ 
    self = [super init]; 
    if (self) { 
    [self setNumber:0]; 
    } 
    return self; 
} 

@synthesize number; 
@end 

的main.m:

#import <UIKit/UIKit.h> 
#import "operator.m" 

int main(int argc, char *argv[]) { 

id operator1 = [[operator alloc] init]; 
id operator2 = [[operator alloc] init]; 

[operator1 setNumber:10]; 
[operator2 setNumber:20]; 

int answer = [operator1 number] + [operator2 number]; 

printf("The answer is %d",answer); 



NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
int retVal = UIApplicationMain(argc, argv, nil, nil); 
[pool release]; 
return retVal; 
} 

我得到一個錯誤 - >ld: duplicate symbol _OBJC_IVAR_$_operator.number in /Volumes/Home/Desktop/testing/build/testing.build/Debug-iphonesimulator/testing.build/Objects-normal/i386/operator.o and /Volumes/Home/Desktop/testing/build/testing.build/Debug-iphonesimulator/testing.build/Objects-normal/i386/main.o

這是我第一次我在節目ObjC。難道我做錯了什麼?

我試着在谷歌上找到的「清理所有目標」修復程序,但沒有幫助。

+0

同樣的.m有兩個不同的目標也會導致這個問題。請檢查我的答案,以防萬一有人來到這個問題尋找答案。[檢查我的答案,如果是這種情況。](http://stackoverflow.com/a/24394570/818506) – 2014-06-24 19:22:51

回答

91
  1. 你永遠不應該#import.m文件到另一個文件。如果需要,您導入.h文件。
  2. 在創建自動釋放池之前,您不應該在main中執行代碼。這遲早會造成問題。在這種情況下,您的測試代碼可能應該在application:didFininshLaunching之內。
+0

@alexBrand:你合併@interface和@implementation for運算符在同一個文件中,然後導入整個事情。不要這樣做。把它們放在operator.h和operator.m中,然後#只把operator.h導入到main.m中。 – 2010-08-14 16:43:34

+0

我導入了operator.h文件,它工作:)。非常感謝。 我也將autorelease池移到了代碼的開頭。 現在,我該如何去使用應用程序:didFinishLaunching? – AlexBrand 2010-08-14 16:47:14

+3

你救了我,我missclicked並添加.m,並想知道爲什麼它不起作用:) – Yanchi 2013-08-06 13:31:49

1

在.m文件中搜索您可以導入任何文件。有時候很難找到它

+0

在這樣的每個問題上都會重複相同的回答,它不再有幫助 – NaXir 2015-08-05 09:45:52

+0

對不起,它沒有幫助你..這是我的問題,當我發現這個問題,然後我分享瞭解決方案..當然沒有幫助了..是從2011年.. – Yotes 2015-08-05 22:31:34

0

對於上述解決方案不是這種情況的其他用戶,這是我的錯誤。我是一個懶惰的程序員,所以而不是重寫新頁面的所有代碼(UIView),我會經常複製和粘貼一個以前的UIView的.m和.h文件...在這樣做時,我有時會忘記更改接口在我複製的.m和.h文件中(即使我更改了文件名)......這也會導致同樣的問題。祝大家好運!

3

靜態的圖書館參與

我添加了一個類,有完全相同的名稱作爲靜態庫中的類,我也用。因此,爲我的課程名稱添加前綴可解決問題。

+0

這對我有效 – PassKit 2013-08-28 07:25:02

+0

爲我工作! – wiseindy 2014-02-07 14:23:35

+0

我有相同的filename.m到源代碼。兩者都不是重複的,只是相同的文件名。我改變了一個,並按照DanSkeel的建議工作。 – itzo 2017-09-05 18:31:06