私は目的 c が初めてで、いくつか疑問があります。var->myPropertyのようなクラスのプロパティにアクセスできること、そしてvariable.myPropertyのようにアクセスできることを見てきましたが、2 つの違いがわかりません。インターネットでよく検索しましたが、実際には見つかりませんでした決定的な答え。
スペルミスがある場合は申し訳ありませんが、事前に感謝します。
私は目的 c が初めてで、いくつか疑問があります。var->myPropertyのようなクラスのプロパティにアクセスできること、そしてvariable.myPropertyのようにアクセスできることを見てきましたが、2 つの違いがわかりません。インターネットでよく検索しましたが、実際には見つかりませんでした決定的な答え。
スペルミスがある場合は申し訳ありませんが、事前に感謝します。
このobj->foo
構文は の ivarfoo
にアクセスしますがobj
、obj.foo
はプロパティ ( で定義@property
) にアクセスします。主な違いは、obj->foo
getter/setter を使用せず、ivar に直接書き込むことです。
たとえば、次のようにプロパティを定義した場合
@property (atomic, strong, readonly) SomeClass *foo;
最新の Objective-C コンパイラは、自動的に ivar_foo
とプロパティfoo
を作成します (ivar を宣言し@synthesize
てプロパティを ing する必要はありません。
obj.foo
次に、自動的にatomic
ゲッターを使用し、プロパティを作成しますreadonly
(つまり、セッターはありません)。ivar 構文を使用するとobj->_foo
、プロパティをアトミックに読み取らず (!)、書き込むこともできます (プロパティはreadonly
! であることを思い出してください)。
通常は非常に簡単です。 と を除いて、常にプロパティ構文init
をdealloc
使用します。そこでは ivar 構文を使用します。実際に getter または setter を自分で実装する場合は、明らかに ivar 構文を使用する別の場所です。(@godel9 に感謝)。(覚えておいてください: これは大まかなガイドラインです。ivar への直接アクセスが必要になるユースケースは他にもあります)。
EDIT : コメントにいくつかの批判があるため: ドット構文は、何かを として宣言せずに使用することもできます@property
。たとえば、 (for )array.count
の代わりに使用することもできます。しかし、OPがプロパティとivarについて質問したことを考えると、それは確かに質問されませんでした. また、特定の ivar は必ずしも必要ではありませんが、最近の ObjC コンパイラでは自動生成された ivar 名になることに注意してください (プロパティを任意の ivar にマップできます)。[array count]
NSArray *array
@property ... SomeClass *foo
_foo
@synthesize
Objective-C のポインタを見て ください http://www.drdobbs.com/mobile/pointers-in-objective-c/225700236