7

この問題についてこのサイトでいくつかの質問を読みましたが、次のことを理解しています。

self.property は、手動または @synthesize によって作成された getter/setter メソッドにアクセスします。プロパティが保持、コピーなどとして宣言されているかどうかに応じて、保持カウントが正しく変更されます。たとえば、保持プロパティは、'retain' で新しい値が割り当てられた以前の値を解放し、保持カウントを 1 増やします。

通常、プロパティは同じ名前のインスタンス変数で宣言されます (手動で割り当てを行う場合は異なる可能性があります)。これは一般に、@synthesize によって生成されたアクセサーがインスタンス変数を使用してメモリ内のオブジェクトを参照し、関連するコマンドを実行するためです。

私の質問は、多くの例で、self.property とプロパティが異なるものに同じ意味で使用されており、ルールを決定するのに苦労しているという事実に基づいています。Apple Docs の「Recipes」サンプル アプリの 1 つの例には、次のようなものがあります。

self.navigationItem.title = recipe.name;
nameTextField.text = recipe.name;    
overviewTextField.text = recipe.overview;    
prepTimeTextField.text = recipe.prepTime; 

と...

self.ingredients = sortedIngredients;

これらの各プロパティには、同じ名前のプライベート インスタンス変数が関連付けられています。すべてが「非アトミック、保持」属性を使用して同じ方法で宣言されます。それぞれがdeallocで解放されます...

ただし、'ingredients' は self を介してアクセスされ、'prepTimeTextField' は直接アクセスされます。

アクセス方法の違いの理由は何ですか?

ビューのデリゲートにアクセスしている場合はどうなりますか? または、以前のView Controllerによって保持されたプロパティとしてView Controllerに渡されたコアデータオブジェクトですか?

どうもありがとう

4

3 に答える 3

2

現時点で特別なことをしていなくても、ほとんどの場合、合成されたセッター/ゲッターを使用して変数にアクセスしたいと考えています。

アプリケーションの開発中に、変数の検証/フォーマット設定をさらに行う必要があることがわかった場合は、必要なセッター/ゲッター メソッドを実装するだけで済みます。合成されたメソッドを使用した場合は、このコードが呼び出されます。

これは、一般的には良い習慣です。

于 2010-11-24T21:52:57.110 に答える
1

あなたがそのようにあなたの財産を宣言するならば:

@property (nonatomic, retain) NSMutableArray *myArray;

生成されたセッターは、渡された値を自動的に保持します。そのため、Appleのサンプルコードでこれが表示されることがあります。

self.myArray= [[NSMutableArray alloc] init]:
[self.myArray release];

最初の行の後に保持カウントが2であるため、「[self.myArrayrelease]」が必要です。それを解放することはそれが1(あるべき場所)に下がることを保証します。

自動生成されたセッターを使用しているだけの場合、クラス内から作業するときは使用しません。私が行うのははるかに簡単です:

myArray = [[NSMutableArray alloc] init];

対上記の例。

私の2セント。

于 2010-11-25T00:14:42.340 に答える
0

依存します。インスタンス変数がダメなら、直接アクセスしても問題ありません。しかし、ほとんどの人がプロパティを介してメンバーにアクセスすることを好む理由は、そのメンバーのロジックについて何かを変更でき、それでも機能するからです。

たとえば、何かをすぐにロードするのではなく、遅延してロードするようにクラスを変更したい場合があります。すでにプロパティを使用してインスタンス変数にアクセスしている場合は、アクセサ メソッドを編集するだけですべてが機能するはずです。

于 2010-11-24T21:24:35.963 に答える