2012-01-25 12 views
7

私は@propertiesだけを使用している私が書いているアプリケーションを持っています。私は、私のクラスファイルのいずれかで宣言された一つのivarを持っていません。私が理解しているように、@プロパティの導入でイーバールはもう必要なくなりました。ベストプラクティスに従ってコーディングしていますか?これは、長期的にはお尻で私を噛んでしまうのだろうか?私は確かにアイバーズを使用してObjective-Cでivarsを使うべきですか?

+0

同じivarのivar宣言とプロパティ宣言の両方がある場合、コードはDRYではありません(繰り返しません)。 –

+0

この質問に対する回答は、とりわけ、あなたが質問をしたときに決まります。ここでの「理想的な」アプローチは、動く目標です。 –

答えて

11

私は一般的にivarsを宣言しません。 私はしばしばthroughメソッドを意味するときに直接アクセスを防止するために @synthesize foo = foo_;を使用しますが、その逆もあります。 そして、私はいつも、コンパイラが自動的に( フレーズを襲った通り、不慮の直接アクセスを防ぐ)_プレフィックスでIVARを合成してみましょう。

Calebが言ったように、まだイワナが浮かんでいるので、あなたが本当に欲しいのでなければ、明示的に宣言しません。(本当にあなたはヘッダーのivarsが公開されていないので、 APIが適切に設計されている場合はクラスのクライアント)。

私はまた、 "init/deallocでの直接アクセスのみを使用し、他のすべての場所でsetter/getterを使用する"という誇大宣伝は、大いに誇張されているので、どこでもセッター/ゲッターを使用することがわかります。実際には、初期化/割り当て解除中にオブザーバを持っていれば、すでにホースされています。オブジェクトの状態は、定義上、構築/破壊中に定義されておらず、したがって、オブザーバは状態について正しく考え出すことができない。


カレブが指摘するように、INIT /のdeallocに直接IVARアクセスを使用する別の理由は、init /のdealloc中オブジェクトの未定義の状態に起因する嘔吐できるカスタムセッター/ゲッターロジックを実装するサブクラスを回避することです。

これは本当かもしれないが、私はそれをカスタム動作とセッター/ゲッターを実装するための厄介なアーキテクチャの欠陥を検討してください。そうすることは脆弱であり、時間の経過とともにコードをリファクタリングすることはかなり難しくなります。同様に、そのようなカスタムビヘイビアはオブジェクト内の他の状態に依存することが多く、その依存関係は、外観がシンプルな@property宣言にはまったく反映されない状態変更に対する依存関係につながります。

I.e.あなたのセッターとゲッターはfoo.bar = bad;は、あなたのコードが逮捕され、fooで任意の時間を実行することができないように書かれている場合。あなたが保護されたプロパティを宣言したいときにIVARを使用したい場合があり

+1

私はivarsを明示的に宣言しなければ、デバッガでその値を調べることができません。だから私は、値の型のためにivarsを明示的に宣言するという習慣を取ってきました。 –

+0

@ohhorobどこに記載されていますか?それは私が同意したことではない - 私はいつもその通りだと思っていた。しかし、私は数回最近のドキュメントでその旨の声明を探して空になった。あなたはそれがどこにあるのか分かっている場合は、共有してください! – Caleb

+0

@エミール - ああ!それは知っていることは素晴らしいことです。私はいつも、一部のアプリケーションで、デバッガの値を見ることができ、時にはそうでないことがあるのか​​も知りませんでした。おそらく、これは、ivarが宣言されているかどうかに結びついています。私はすぐにこれを調べなければならない! =) – ElasticThoughts

2

しかしベストプラクティスは現在、代わりに@propertyを使用するためにプッシュするか、間違っていない...「右」と「間違った」あるものに混合レビューを読んでてきました。

15

インスタンス変数が必要ないほどです。そのインスタンス変数宣言は必要ありません。プロパティと@synthesizeステートメントが与えられると、コンパイラは適切なアクセサメソッドとともにインスタンス変数を作成します。

プロパティを排他的に使用しても問題はありません。それらはメモリ管理を簡素化します。 iVarsをプロパティなしで使用しても、それが必要な場合は何も問題ありません。プロパティを使用したいが、アクセサーを世界にアドバタイズする(カプセル化を維持する)ことを望まない場合は、クラス拡張(基本的に実装ファイルの匿名カテゴリ)で非公開プロパティを宣言することを検討してください。

0

場所の一つです。クラスの.mファイルのプロパティを宣言し、対応するivarを@protectedディレクティブで.hに宣言します。これにより、サブクラスで保護されたアクセスが可能になります。メンバーへの保護されたアクセスの代替手段はありません。

関連する問題