2

私は目的 c が初めてで、いくつか疑問があります。var->myPropertyのようなクラスのプロパティにアクセスできること、そしてvariable.myPropertyのようにアクセスできることを見てきましたが、2 つの違いがわかりません。インターネットでよく検索しましたが、実際には見つかりませんでした決定的な答え。

スペルミスがある場合は申し訳ありませんが、事前に感謝します。

4

3 に答える 3

2

このobj->foo構文は の ivarfooにアクセスしますがobjobj.fooはプロパティ ( で定義@property) にアクセスします。主な違いは、obj->foogetter/setter を使用せず、ivar に直接書き込むことです。

たとえば、次のようにプロパティを定義した場合

@property (atomic, strong, readonly) SomeClass *foo;

最新の Objective-C コンパイラは、自動的に ivar_fooとプロパティfooを作成します (ivar を宣言し@synthesizeてプロパティを ing する必要はありません。

obj.foo次に、自動的にatomicゲッターを使用し、プロパティを作成しますreadonly(つまり、セッターはありません)。ivar 構文を使用するとobj->_foo、プロパティをアトミックに読み取らず (!)、書き込むこともできます (プロパティはreadonly! であることを思い出してください)。

通常は非常に簡単です。 と を除いて、常にプロパティ構文initdealloc使用します。そこでは 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

于 2013-10-26T13:23:46.650 に答える
0

Objective-C のポインタを見て ください http://www.drdobbs.com/mobile/pointers-in-objective-c/225700236

于 2013-10-26T13:22:55.550 に答える