2010-11-30 4 views
2

ほとんどのiOS SDKチュートリアルでは、Appleや他の場所からオンラインで読んだので、多くのインスタンス変数は、自分のクラス内からのみアクセスされてもプロパティになります。iOS SDKのチュートリアルですべてがプロパティになっているのはなぜですか?

E.G. Facebookの最新のiOS SDKでは、ユーザーはfacebookというFacebookクラスのインスタンスをアプリケーションデリゲートに保持することをお勧めします。 facebook"はプロパティです。これはサンプルコード全体を通して "self.facebook"と呼ばれます。しかし、 "facebook"プロパティは、アプリケーションデリゲートの外部からは参照されません。

これはなぜですか?私は何が欠けていますか?インスタンス変数がそれ自身のクラス内でのみ使用されている場合、私の傾向はではなく、ではなく、公開されないようにするプロパティであり、self.facebookまたはself->facebookではなくfacebookと簡単に参照してください。

正直言って、私がFacebookのプロパティを必要としていたとしても、私はむしろ、単に "self.facebook"ではなく単に "facebook"としてアプリケーションデリゲート内で参照したいと思います。

だから何ですか?なぜ私はどこのプロパティを見ていますか?

答えて

7

プロパティは、iVarが公開されているかどうかとは関係ありません。代わりに、プロパティは、保持を管理し、カプセル化を促進するアクセサメソッドを作成します。

プライベートプロパティが必要な場合は、@privateディレクティブの下にivarを宣言してから、実装ファイルにプロパティを定義します。

+0

これはやり方です。プロパティを使用することは素晴らしいことですが、クラス外で使用したくないプロパティを公開しないことも素晴らしいことです。また、プロパティが保持を管理するのに役立つというあなたのコメントを強化します。 –

+1

偉大な、私の質問から明らかではないが、これは私が探していた答えです。私はプロパティを使用することの価値を参照してください、しかし、彼らは不必要に公に公開されるかもしれないという考えは、 ..privateが答えです。 –

0

自動的にゲッター/セッターが作成されます。 また、ここで説明するよい投稿ですproperties

1

facebookを参照すると、self.facebookにアクセスすると変数に直接アクセスし、setter/getterメソッドを実行します。

結果は、オブジェクトを変更する必要がある場合や後でsomepointで値を変更する処理(つまりボクシング)中に他の処理を行う必要がある場合、これをセッターメソッドに入れることができます。どこでもそれをやることを減らす。それはいいことです。

3

通常、インスタンス変数に直接アクセスするのではなく、アクセッサを使用してアクセスする方がよいでしょう。プロパティはこれらのアクセサを作成し、適切なキー値変更通知やアトミックアクセスなどのものも提供します。

3

プロパティはゲッターとセッターを生成できます。特に、セッターは、オブジェクト(セミ)の保持/解放カウントを自動的に管理するのを助け、ある種の潜在的なメモリバグを減らすことができます。

非オブジェクトのゲッターとプロパティは、将来、コードの拡張や再利用の際に、ミューテータ、キー値通知などに使用される可能性がありますが、主にコーディングスタイルの直交性に役立ちます。

いくつかの効率の違いや欠点がありますが、使用する特定のObjCの実行時間によって異なります。

+0

+1 Key-Value Observingを使用するには、プロパティも必要です。インターフェイスファイル(.h)に公開されるパブリックプロパティは、他のオブジェクトにプロパティの呼び出し方法を通知します。 – TechZen

+0

ありがとう、素晴らしい答え。 –

4

プロパティを使用する必要がある理由の素晴らしい例(TechZenのようにプロパティをプライベートにすることができます)は、viewDidLoadで新しいインスタンスを作成しています。

View Controllerのインスタンスごとに1回呼び出されるため、人はこれを常に行います。または、あなたはそう思います...実際には、アプリケーションがメモリ警告を受け取ったときに何が起こるかによって、viewDidLoadクラスはインスタンスごとに複数回呼び出すことができます。あなたがリークを持って、再び呼び出されるまで -

- (void) viewDidLoad 
{ myArray = [[NSMutableArray alloc] init]; } 

は素晴らしい作品:よう

したがって、たとえば、あなたはよくコードを書くかもしれません。場合によっては、myArrayを割り当てることもできますが、それは忘れやすい簡単なステップです。

あなたががすべてのインスタンス変数のプロパティを使用する場合は、あなたのコードは次のようになります。

- (void) viewDidLoad 
{ self.myArray = [NSMutableArray array]; } 

今、あなたはそれが間違って取得することはできません。 viewDidLoadが複数回呼び出されると、古い配列が解放され、古い配列が漏れないように新しい配列がその場所に配置されます。

+0

などありがとう。 –

関連する問題