2016-08-05 12 views
1

私は2つのobjc .mクラスを持っています。私たちはcontroller1.mとcontroller2.mを呼び出します。コンパイルエラーの原因となる異なるクラスの同じ名前のインスタンス変数

controller1.m

@implementation controller1 
    UIAlertController *alertController; 
//more code 
@end 

controller2.m

@implementaion controller2 
    UIAlertController *alertController; 
//more code 
@end 
:controller1.mとcontroller2.mの両方で、私は、このような何かをUIAlertControllerのインスタンスを持っています

プロジェクトをビルドしようとすると、エラーが発生します

リンカコマンドは終了コード1(呼び出しを参照するには、-v使用)

に失敗し、エラー・ログには、私が今のインスタンス変数の名前を変更し、この

duplicate symbol _alertController in: 
/Users/.../Xcode/DerivedData/AppName-cdtbqibmmbsosrdeyqughefeazaa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/x86_64/controller1.o 
/Users/.../Xcode/DerivedData/AppName-cdtbqibmmbsosrdeyqughefeazaa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/x86_64/controller2.o 

のように見えますそれが働いた...私はなぜこれをしなければならないのですか? Xcodeは、これらの変数が(名前のために)同じ方法で使用されていることを認識していますし、それらをグローバルに宣言する必要がありますか?

+1

プロパティとしてインターフェイスに宣言します。 – danh

+0

@ダンああ、大丈夫。しかし、それはなぜですか? [私を許して、私は目的-cでかなり新しい] –

答えて

4

これらの変数はインスタンス変数ではありません。それらはグローバル変数です。あなたはそれを持っているとして、コードは各モジュールで同じ名前のグローバル宣言し

@implementation controller1 { 
    UIAlertController *alertController; 
} 

//more code 

@end 
+0

ああ大丈夫、ありがとう。そして、あなたがダンがそれをクラスの特性にすることによって推薦された方法と対比させる方法と違いがありますか? –

+1

私の方法は、インスタンス変数の宣言を修正します。 Danの方法は、インスタンス変数をプロパティで置き換えます。プライベートプロパティやインスタンス変数を使用すべきかどうかについては、多くの議論があります。どちらの手法も有効です。 – rmaddy

+0

よろしくお願いいたします。私はインスタンス変数とプロパティの違いを読まなければならないようです。これまでのところ、違った方法でアクセスされているようです。 –

1

次のように彼らにインスタンス変数を作るために

は、彼らが@implementationブロックの中括弧にする必要があります。ポインタをそれぞれのクラスに対してプライベートにするには、プロパティを使用してください。

// controller1.m 

@interface controller1() 

@property(strong,nonatomic) UIAlertController *alertController; 
// any other property private to controller1 

@end 

@implementation controller1 

// only methods here 

@end 
+2

正しく修正するためにプロパティに変更する必要はありません。 – rmaddy

+0

ありがとう! @rmaddyが推奨するものと比べて、あなたが推奨しているものに違いがありますか/なぜそれをお勧めしましたか?彼の答えはあなたの前に少し現れたので、私はrmaddyの答えを受け入れました。 –

+1

確かに彼の前に私の質問にコメントしたことが分かります。違いは、カバーの下でゲッターとセッターメソッドを作成するもう少し現代的な宣言を提案していることです。したがって、 'self.alertController'または' self.alertController = // blah'と言うことができます。 – danh

関連する問題