web-dev-qa-db-ja.com

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でプログラムするのはこれが初めてです。私は何か間違ったことをしていますか?

グーグルで見つけた「すべてのターゲットをクリーンアップ」修正を試しましたが、役に立ちませんでした。

21
AlexBrand
  1. #importファイルを別のファイルに.mしてはいけません。必要に応じて、.hファイルをインポートします。
  2. 自動解放プールを作成する前に、mainでコードを実行しないでください。それは遅かれ早かれ問題を引き起こすでしょう。この場合、テストコードはおそらく代わりにapplication:didFininshLaunchingに入れる必要があります。
94
Jakob Borg

任意のファイルにインポートできる.mファイルから検索します。時々それを見つけるのは難しい

1
Yotes

上記の解決策が当てはまらなかった他のユーザーにとって、これは私の問題でした。私は怠惰なプログラマーなので、新しいページ(UIView)のすべてのコードを書き直す代わりに、以前のUIViewの.mファイルと.hファイルをコピーして貼り付けることがよくあります...そうすることで、名前を変更するのを忘れることがあります。コピーした.mファイルと.hファイル内のインターフェイス(ファイル名を変更した場合でも)...これにより、これと同じ問題が発生します。他のみんなに頑張ってくださいこれも起こりました!

0
Albert Renshaw

私の場合、ビルドフェーズ->ソースのコンパイルの.mファイルで二重宣言を見つけました。重複を削除すると、問題は解決しました。お役に立てれば。

0