2011-02-06 16 views
2

これはやや基本的な質問ですが、私はstackoverflow.comで非常に多くのドキュメントと質問を読んだあと、まだいくつかの疑問が残っています。いくつかのインスタンス変数をプロパティとして宣言する理由

いくつかのインスタンス変数をプロパティとして宣言する理由を知りたいと思います。

MYViewController.h 
    @interface MyViewController : UIViewController { 
     UIButton *btn; 
     NSString *name; 
    } 
    @property (nonatomic, retain) UIButton *btn; 
    @property (nonatomic, retain) NSString *name; 

MyViewController.m 
    @implementation MyViewController 
    @synthesize btn; 

-(void) viewDidLoad() 
{ 
    [btn setTitle:@"Hello" forState:UIControlstaeNormal]; //this is first way where there is no need to declare btn as property 

    [self.btn setTitle:@"Hello" forState:UIControlstaeNormal]; //this is second way where we do need to decalre btn as property as we are accessing it through self 


//Setting value of name 

    name = @"abc"; //this is first way where there is no need to declare name as property 
    [self setName:@"abc"; //this is second way where we do need to declare name as property as we are accessing its aetter method through self 

} 

今、私たちはプロパティとして宣言することなく、BTN変数のgetter/setterメソッドを使用することができたときに知りたい上記のコードでは、プロパティとして宣言する必要があり、何を設定するには良い方法であります"name"の値

私は、インスタンス変数を他のクラスオブジェクトにアクセスさせたい場合は、インスタンス変数として宣言する必要があります。それがプロパティとして宣言されるべき唯一の状況ですか?

基本的には、インスタンス変数をどのような状況でプロパティとして宣言するのか少し混乱します。

お勧めします。 ありがとうございます。

答えて

1

一般的に、あなたはそれらを使用します。欠点は、これらの詳細を隠すように気を付けない限り(時には苦痛である)、クライアントとサブクラスがパブリックインターフェイスを乱用する可能性があることです(すべてのobjcメソッドは公開されています)。適切なレベルの可視性を備えた、必要なクラスインターフェイスを実現するために、時にはうまくいくことが求められます。

2)あなたは、自動生成されたアクセサ

nonspecializedアクセサを実装する面倒で、エラーが発生しやすい

をしたいです。時間を節約し、コンパイラがそれらを生成できるようにする方がよいでしょう。

3)行動

を文書化するために、時にはそれが過剰文書期待される結果を@property (copy) NSString * title;の代わりを書く方が良いでしょう。

4)ドット構文で厳しい選択マッチング

コンパイラは厳しいセレクタマッチングを行います。可能であれば、コンパイル時にエラー/問題をキャッチすることを好みます。

5)を直接

にObjCのアイバーズがデフォルトで保護されていアイバーズを扱うのではなく、それらを使用するサブクラスを強制します。クラスの使用方法や配布方法に応じて、またはサブクラスが基本クラスを正しく使用するようにプライベートにすることをお勧めします。

これには数多くの理由があります。糸通しとメンテナンスは大きなものです。

ivarを非公開として宣言し、サブクラスに使用するプロパティを指定すると、サブクラスはそのプロパティに直接アクセスするのではなく、その実装でプロパティを使用することが強制されますivar。

so ...最終的には、使用しているインターフェイスとペアにして、クラスの実装の詳細や設定に依存します。私はここには難しいと速いルールがないと思う - より少ない悪と利便性が重要な動機です。

+0

詳細な投稿はThanxです。私は本当に感謝しますが、あなたは私の質問、そして基本的に私の質問で例を挙げて尋ねられる2つの混乱についてより具体的にしてください。 – Aisha

+0

@Kiaraよろしくお願いします。確かに、その明確化では、viewDidLoadの例の文脈では、インスタンス変数にアクセスして設定する方法に最も興味があると思います。 ( '@property(nonatomic、retain)UIButton * btn;' < - この行はプロパティ宣言です)。あなたが提供した実装は明示的にスレッドセーフではありません3)パブリックゲッターとセッターがあります4) 'viewDidLoad'は完全に構築されたクラスインスタンスを使用します(cont) – justin

+0

(cont)5 )あなたは部分的に破壊されたインスタンスを使用していません6)メソッドがオーバーライドされ、再オーバーライドされる可能性があります - この場合はプロパティを介してアクセスします – justin

3

要するに、必要がない限り、インスタンス変数をプロパティとして宣言する必要はありません。 getterメソッドとsetterメソッドを自動生成するために、変数をプロパティとして宣言します。プロパティの宣言では、それらをどのように設定するかを指定することができます(vs assign、atomic vs nonatomic)。次に、getterとsetterは@synthesizeディレクティブで生成されます。 再度、プロパティを使用するための正しい方法と間違った方法はありません。一部の人はそれらを使用しない人もいれば、すべての変数をプロパティにする人もいます。それは本当にあなた次第です。プロパティは、クラスが指定したメソッドを公開する必要がある場合に使用するクラス

のパブリックインターフェイスに属する

1):ので

関連する問題