2

理由はわかりませんが、問題なく作業した後、いくつかのボタンを追加してからアプリを起動すると、次のエラーが表示されました。

ld:/Users/alexbarco/Library/Developer/Xcode/DerivedData/RecolectaDatos-ayjpqqcajbhuzvbkvernzsyunpbe/Build/Intermediates/RecolectaDatos.build/Debug-iphonesimulator/RecolectaDatos.build/Objects-normal/に重複するシンボル_x Users / alexbarco / Library / Developer / Xcode / DerivedData / RecolectaDatos-ayjpqqcajbhuzvbkvernzsyunpbe / Build / Intermediates / RecolectaDatos.build / Debug-iphonesimulator / RecolectaDatos.build / Objects-normal / i386 / ViewController.o for Architecture i386 c終了コード1で失敗しました(呼び出しを確認するには-vを使用してください)

4

2 に答える 2

1

重複するシンボルエラーがある場合は常に、ヘッダーに循環#importが含まれていることが原因です。解決策は非常に単純で、可能な場合は前方宣言を使用し、代わりに.mファイルから.hファイルをインポートします。

ある.hを別の.hから#importする必要があるのは2つの場合だけです。

  1. #importでクラスを拡張する場合
  2. #importでプロトコルを実装しています

具体的には、署名でクラス名またはプロトコルを使用するためだけにファイルをインポートする必要はありません。代わりに、前方宣言を使用してください。

たとえば、これ(Bar.h内):

#import "Foo.h"

これになるかもしれません(Bar.h):

@class Foo;
@protocol FooDelegate;

およびbar.m:

#import "Foo.h"

前方宣言に関するドキュメントへのリンクは次のとおりです。

于 2012-07-17T17:14:39.500 に答える
1

_x「シンボルの重複」メッセージは、同じスコープ内で名前(この場合は)を2回宣言していることを意味します。次のようなコードがあるとします。

int _x = 1;
int _x = 2;

その場合、エラーが発生することを期待しますよね?2つのものに同時に同じ名前を使用できます。

発生するエラーは基本的に同じです。あなたは_xどこかで宣言していて、コンパイラの観点からはそれを2回行っています。何_xを表すかに応じて、これに対処するいくつかの方法があります。

chraheyの答えは、フォワードクラス宣言について説明しています。クラスAの定義がクラスBに依存し、その逆も同様である循環参照を解決するのに前方宣言が役立つということを除いて、ここではこれについては再度説明しません。

が変数の場合_x、ヘッダーファイルで宣言しようとしている可能性があります。コンパイラは基本的に、ソースファイルにインポートする各ヘッダーファイルの内容をコピーするため、ヘッダーファイルで変数を宣言してから、そのヘッダーを2つ以上の実装ファイルにインポートすると、その複数の宣言が発生します。変数。これを回避するには、externキーワードを使用してコンパイラに「この名前は別の場所で宣言されます」と伝えてから、実際の宣言を実装ファイルに入れます。

Foo.h:

extern int _x;

Foo.m

int _x;

関数についてもほぼ同じことが言えます。関数であるようには見えませんが_x、そうである場合、関数定義をヘッダーファイルに入れるのに十分愚かだった場合、そのファイルが複数の実装ファイルにインポートされた場合、再びエラーが発生します。 。これが、ヘッダーファイルに定義ではなくプロトタイプが含まれている理由です。

Foo.h:

int foo(int a);

Foo.m

int foo(int a)
{
    return a + 10;
}
于 2012-07-17T18:10:56.160 に答える