Objective Cのa.bとa-> bの違いは何ですか?

objective-c
Objective Cのa.bとa→ bの違いは何ですか?

A.Bの要件は、Aがセッターまたはゲッターを使用する前に@synthesizeを宣言する必要があることですが、A→ Bはこれを必要としません。

どちらが優れているか、どのメモリが最も少ないメモリを使用しているのかわかりません。

A.BからA→ Bに変換すると、使用するメモリが少なくなりますか、それとも同じ量になりますか? A→ Bは、@ synthesizeを宣言する必要がないため、使用するメモリが少なくなりますか?

  2  0


ベストアンサー

「a」がObjective-Cオブジェクトの場合、「a.b = c;」は「[a setB:c];」を記述するのと同じです。

この場合の「setB:」は、「@ property(…​)typeB b;」および「@synthesize b」を指定する場合の自動生成セッターメソッドのデフォルト名です。 `…​`の代わりに、対応するメモリ指定子を、retain、assign、copyとして配置できます。 「a→ b = c」と記述することで、セッターメソッドを使用せずに、「b」に直接アクセスできます。

したがって、 `a→ b`を作成すると、生成されるエクストラコードは少なくなりますが、主要なOOPの概念である「カプセル化」の1つに違反します。また、メモリ関連のスタッフを手動で処理する必要があります。

たとえば、 b`の @ property`で retain`を指定した場合、構築 a.b = c`は、 `a→ b = [c retain]`とほぼ同じように動作します。

3


質問にもCというタグが付けられているため、a→ bおよびabは構造(a)の同じ要素(b)にアクセスしますが、最初の場合はaは構造へのポインターであり、2番目のaは構造自体です。

2


一方が他方より優れているというわけではありません。 彼らは違うことをします。

プロパティ(つまり、「@ property」と「@synthesize」または「@dynamic」)を宣言すると、コンパイラは標準のObjective-C命名規則を使用して、ゲッターとセッターを生成します。

a→ bは実際にはCの構成体です。 Objective-Cで使用できますが、あまり一般的ではありません。 おそらく最も簡単な説明方法は、次のコードを使用することです。

typedef struct { int a; int b; } someType;

someType a;
someType* b;

// assign values
a.a = 1;
a.b = 2;

// also assign values (assume memory has been allocated)
b->a = 1;
b->b = 2;

(これはメモリからです。 タイプミスがあるかもしれません。)

2


a.b => member b of object a
a->b => member b of object pointed by a

オブジェクトの最初のメモリでは、スタックに「a」が割り当てられます。 2番目のケースでは、 `a`が指しているオブジェクトのメモリは、フリーストアから提供されます。

注:あなたの質問はC ++にタグ付けされているためです。

0


aが構造体の場合、a.bを使用します

aが構造体へのポインタである場合は、a→ bを使用します

aがオブジェクトポインターで、bがivarの場合、a→ bを使用します

aがオブジェクトポインターで、bがプロパティの場合、a.bを使用します

0


タイトルとURLをコピーしました