0

合成を次のようなプロパティとして宣言すると:

@syntesize myObject = _myObject;

_myObject合成されたゲッターとセッターを回避しながら、コードで直接アクセスできます。

しかし、このようにプロパティを合成すると

 @syntesize myObject = myObject;

の背後にあるインスタンス変数にアクセスできなくなります= myObjectか? どちらかを使用することを優先する必要があります。の代わりBAD_ACCESSに使用すると「-問題」を経験することがよくあるためです。_myObjectself.myObject

4

3 に答える 3

3

どちらの場合も、基になるivarにアクセスできます。どちらの場合も、そうすることは避けてください。init、dealloc、およびアクセサー自体を除くすべての場所でアクセサーを使用します。これにより、ARCの有無にかかわらず、多くの頭痛の種を回避できます。

とはいえ、EXC_BAD_ACCESSARCでivarにアクセスしている場合は、次のいずれかを実行している可能性があります。

  • の誤った使用__bridge
  • 使用中assignまたは__unsafe_unretained安全でない
于 2012-05-02T14:14:39.007 に答える
1

プロパティを作成する場合は、プロパティアクセサーを使用し、インスタンス変数を直接使用しないようにする必要があります。唯一の例外はあなた-init-deallocメソッドにあり、ほとんどの場合、そこでアクセサを使用しても問題ありません。アクセサーを避けないで、それらを使用してください。

于 2012-05-02T14:15:09.510 に答える
1

を使用_myObjectすること自体で、メモリ管理の問題が発生することはありません。原因はほぼ確実に別の場所にあるか、単純にアンダースコアの接頭辞が付いた ivar 名を使用するよりもはるかに微妙です。とにかく、ivar にプロパティと同じ名前を付けた場合でも、通常どおり、その名前だけを使用してインスタンス変数にアクセスできます。ivar に直接アクセスしていないのは、アクセサ メソッドを介して (self.myObjectまたは または などを使用して) アクセスする場合のみです。[self myObject]を使用してアクセスすることもできます。self->myObjectこれは単に と同等ですmyObject

initとは言っても、 ( deallocARC を使用していない場合は)アクセサー メソッドの実装自体の内部で ivar に直接アクセスすることをお勧めします。

于 2012-05-02T14:15:46.090 に答える