Objective-Cでivarsを使用する必要がありますか?
-
14-11-2019 - |
質問
私は@Propertiesのみを使うのを書いているアプリケーションを持っています。私は私のクラスファイルのいずれにもすべてのIvarを宣言していません。私はITを理解しているので、@propertyの導入にはもはや必要ありません。私はベストプラクティスに従ってコーディングしていますか?これは長期的には箴言のお尻で私を噛むのでしょうか?私は「正しい」と「間違った」とは混合レビューを読んでいます...
解決
私は一般的にivarsを宣言しません。 私は、スルーメソッドまたはversaを意味するとき、またはその逆の間に直接アクセスを防ぐために@synthesize foo = foo_;
を使用します。と私は常にCompilerに_
プレフィックス(偶発的な直接アクセスを防ぐ)を自動的に合成させます。 句)にあたり。
と言って、述べたように、まだ浮かんでいるように、あなたが本当に望んでいない限り、あなたは明示的に宣言しないでください(これは、あなたがヘッダーの中の露出したアイバルは顧客に役に立たないものではないものです。 APIが適切に設計されている場合は、クラスの。
私はまた、「init / deallocで直接アクセスするだけで、他のどこにもSETTER / getterを使用するだけで使用する」と主に倒壊すること、したがって、いたるところでsetter / getterを使用するだけであることもわかりました。実際には、初期化/割り当て解除中にオブザーバがある場合は、すでにホールドしています。物体の状態は、定義によって、建設/破壊中に未定義であり、したがって、観察者が状態について正しく理解することはできません。
CALEBを指すように、init / deallocで直接IVARアクセスを使用するもう1つの理由は、init / deallocの間にオブジェクトの未定義の状態によって盗まれたカスタムセッター/ゲッターロジックを実装するサブクラスを避けることです。
これは当てはまるかもしれませんが、カスタム行動を備えたセッター/ゲッターを実装するための厄介な建築の欠陥を考えます。そうすることは壊れやすく、そして時間の経過とともにコードをリファクタリングすることを大幅に困難にします。同様に、そのようなカスタム動作は、オブジェクト内の他の状態に依存し、その依存関係は、Seming Simple @property
宣言によってすべての反映されていない状態の変化に対する注文依存関係につながります。
すき。 foo.bar = bad;
のでの時刻を実行できないようなセッションとゲッターが書かれている場合、コードは逮捕されます。
他のヒント
インスタンス変数が必要とされていないことはそれほど多くはありません。それはただのインスタンス変数宣言が必要ありません。プロパティと@synthesizeステートメントを指定すると、コンパイラは適切なアクセサメソッドと共にインスタンス変数を作成するのを大切にします。
プロパティを排他的に使用することに問題はありません。メモリ管理を簡素化します。それがあなたが望むものであれば、プロパティなしでivarsを使用することにも問題がありません。あなたがプロパティを使用したいが、アクセサを世界の他の世界に宣伝したくない場合は、(すなわちカプセル化を維持する)。/ P>
IVARSを使用する確かに間違っていないが、代わりにベストプラクティスは@propertyを使用するためにプッシュされます。
IVARを使用することをお勧めしたい場所の1つは、保護されたプロパティを宣言したい場合です。クラスの.mファイルのプロパティを宣言し、@ Protectedディレクティブで.hに対応するIVARを宣言します。これにより、サブクラスで保護されたアクセスを可能にします。メンバーへの保護されたアクセスに代わるものはありません。