2012-03-09 17 views
1

現在、Objective-Cのメモリ管理とプロパティについて学習中です。私は最近、@property@synthesizeがどのようにObjective-Cで動作するかに関して、this postanswers to my previous questionを読んでいます。これは物事を幾分明らかにしました。Objective-Cのローカル変数とメンバ変数

ローカル変数とメンバ変数をメモリ管理の点で区別するのがポイントのようですが、私はまだその件について完全にはっきりしていません。

私が持っている場合:

@interface FooClass : NSObject { 
    NSObject *bar_;  
} 

私はプロパティを作成する必要がありますなぜですか?私は、プロパティがgettersとセッターを作成することを理解しますが、何ですか? foo.bar_ = newObject;を使用して設定できるインスタンス変数bar_があります。どんな利点が私にbarと呼ばれるプロパティを持っていると foo.bar = newObjectを使用して設定しますか?

答えて

0

bar_foo.bar_に設定することはできません。Objective-Cではドットシンタックスが実際にセッターメソッドを呼び出すため、セッターを作成せずに設定することはできません。

さらに、通常bar_はプライベートなので、クラス外から直接アクセスすることはできません。

プロパティを作成すると、自動的にゲッター/セッターメソッドが作成されます。それだけでなく、メモリの問題も(保持、コピー、割り当てなどのプロパティを作成するときに指定するパラメータに従って)注意が必要です。

1

まず第一に、あなたは

foo->bar_ = newObject; 

を使用する必要が

foo.bar_ = newObject; 

を使用することはできませんインスタンス変数にアクセスするために(もちろん、bar_ I-VARは、パブリックとして宣言する必要があります

上記のようなオブジェクトを割り当てると、すべての割り当てでメモリ管理関連のコード(非ARCプロジェクト内)を強制的に追加することになります。増分コード複雑さ。

プロパティを使用してセッターまたはゲッターをオーバーライドするもう1つの理由は、割り当て時または値の解決時にカスタムアクションを実行できるようにするためです。

しかし、ここでの主な理由は、OOPの原則に慣れていない場合です。抽象化です。あなたのクラスのユーザは、内部的にクラスがどのように実装されているかを知ってはいけません。そうしないと、あなたのコードに多すぎる依存関係が発生します。そして、何かを分けたり、更新したり、サポートしたりするのは本当に難しいでしょう。

+0

好奇心を失ってivarを公開するにはどうすればよいですか? –

+0

'@interface SomeClass:ParentClass { @private id _privateVar; @ public id _publicVar; } ' – Denis

0

ゲッター/セッターは、イーバールをカプセル化し、メモリー管理、同時アクセス(非原子..)などの処理を行います。KVOのようなものはゲッター/セッターのような規則に依存します。