2

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

Facebookの最新のiOSSDKのEGでは、ユーザーはfacebookアプリデリゲートで呼び出されるFacebookクラスのインスタンスを維持することをお勧めします。facebook"プロパティです。これは、サンプルコード全体で「self.facebook」と呼ばれます。ただし、「facebook」プロパティは、アプリデリゲートの外部からは参照されません。

どうしてこれなの?私は何が欠けていますか?インスタンス変数がそれ自体のクラス内でのみ使用される場合、それをプロパティにして公開されないfacebookようにし、クラス内ではなく、self.facebookまたは クラス内から参照することをお勧めしself->facebookます。

率直に言って、Facebookプロパティが必要な場合でも、アプリデリゲート内では「self.facebook」ではなく単に「facebook」と呼びたいと思います。

では、何が得られるのでしょうか?なぜ私はどこにでもプロパティを見ているのですか?

4

6 に答える 6

7

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

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

于 2010-11-30T21:22:05.860 に答える
4

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

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

したがって、たとえば、次のようなコードを書くとよいでしょう。

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

うまく機能します-再度呼び出されるまで、リークが発生します。念のため、割り当てる前にmyArrayを解放することもできますが、問題はそれを忘れるのが簡単なステップです。

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

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

Now you can't get it wrong. If viewDidLoad is called multiple times, the old array will be released and a new one will go in its place, without leaking the old array.

于 2010-11-30T21:47:31.673 に答える
3

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

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

いくつかの効率の違い/欠点があるかもしれませんが、それは使用中の特定の ObjC ランタイムに依存します。

于 2010-11-30T19:27:36.377 に答える
3

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

于 2010-11-30T19:15:50.240 に答える
1

facebookを参照する場合は、変数に直接アクセスします。self.facebookにアクセスする場合は、setter/getterメソッドを経由します。

その結果、オブジェクトを変更する必要がある場合、または後のある時点で、値を変更するプロセス(つまり、ボックス化)中に他のことを行う必要がある場合は、これをsetterメソッドに入れて、実行する必要を減らすことができます。どこでもそれ。それは良いことです。

于 2010-11-30T19:08:14.637 に答える
0

ゲッター/セッターを自動的に作成します。また、ここにそれの特性を説明する良い投稿があります

于 2010-11-30T19:07:13.670 に答える