2

2つの違いを理解しています。self.propertyNameアクセサメソッドを使用するのに対し_propertyName、インスタンス変数に直接アクセスします。ですから、私が理解しているように、を使用したくないのは、プロパティのアクセサメソッド内だけです。これは、無限ループが発生するためです。私がそのルールに従う限り、クラスメソッド内でそのプロパティを取得/設定する必要があるたびにself.propertyNameを使用することは問題ありませんか、そしておそらく一貫性のために良いですか?self.propertyName

あなたの知恵をどうもありがとう!

4

3 に答える 3

3

はい、あなたはその場にいます。一貫性は、これらすべての中で最も重要なことです。私の個人的な好みは、可能な限りドット表記を使用することですが、必要に応じて(たとえば、ゲッター/セッター内で)直接インスタンス変数を使用します。

そうは言っても、プロパティセッターメソッドを使用している場合は注意が必要です。self.property = val内部でsetProperty:も無限ループが呼び出されるためです。解決策は_property = val

于 2012-11-16T17:28:56.483 に答える
3

セッターやゲッターだけでなく、半分構築された、または半分破壊されたクラスで公開されたメソッドを呼び出すのは安全ではないという理由でinit、メソッドのドット表記は避ける必要があります。dealloc

特定のリスクは、サブクラスがそのアクセサーにロジックを追加した可能性があることです。でアクセサを呼び出す場合は、サブクラス自体の割り当てが解除された後deallocにサブクラスを呼び出します。アクセサを呼び出すと、サブクラスが初期化される前にサブクラスが呼び出されます。init

Key-Valueオブザーバーがいる場合にも、ほぼ同じことが起こる可能性があります。セッターを呼び出すと、現在の状態に関係なく、変更が通知され、参照が与えられます。したがって、サブクラス化を厳密に禁止した場合でも安全ではありません。

于 2012-11-16T17:35:49.767 に答える
1

プロパティを適切に使用すると、(前述のように)一貫性がさらに高まり、サブクラス化も向上します:)


それでも...状況によっては..たとえば、アトミックなものにしたいスレッドコンテキストでは、varにフォールバックする必要があります

于 2012-11-16T17:34:31.270 に答える