1

重複の可能性:
C での矢印演算子 (->) の使用
ドット (“.”) 演算子と矢印 (“->”) 演算子の C と Objective-C での使用

私は 2008 年に最後に更新されたフリーウェア/オープンソース プログラムを見ている初心者ですが->、次の表記法を認識できません。

- (id)copyWithZone:(NSZone *)zone
{
  GFIPGeniusItem * newItem = [[[self class] allocWithZone:zone] init];
  newItem->_stringValue = [_stringValue copy];
  newItem->_imageURL = [_imageURL copy];
  newItem->_webResourceURL = [_webResourceURL copy];
  newItem->_speakableStringValue = [_speakableStringValue copy];
  newItem->_soundURL = [_soundURL copy];
  return newItem;
}

ある種のショートカットを許可していると思いますが、具体的に何をするのか知りたいです。

4

4 に答える 4

6

これは、オブジェクトの外部から ObjC オブジェクト内のインスタンス変数に直接アクセスする方法です。(構文 and->は C 構造体から借用され、参照が構造体へのポインターであるかのように動作します)。

このアクセス メカニズムは、現時点ではほとんど痕跡が残っており、最新の ObjC コードではほとんど見られません。適切なカプセル化には、インスタンス変数に直接触れるのではなく、アクセサーとプロパティを使用する必要があるためです。ただし、いくつかの非常に特殊なケースでは正当であり、これはその 1 つです。

オブジェクトをコピーするときは、現在の の状態と正確に一致する結果のコピーを取得する必要がありますselfinitこれを実現する最もクリーンな方法は、多くの場合、コピーの ivar を明示的に設定して、オーバーロードまたはアクセサーが引き起こす可能性のある副作用を防ぐことです。それを行うコードは問題のクラス内にあるため、「安全」です。そのため、ivar を変更または追加する必要がある場合は、このコードを更新して、必要になる可能性のある他のすべてのことを知っておくことができます。

問題のクラスの外からこれを行うのは悪い形であり、それを行う正当な理由はありません。

于 2012-09-24T21:20:58.277 に答える
2

それがポインタ間接演算子です。a->bと同じことを意味します(*a).b(ここで、the.は、Objective-C のプロパティ ドット構文ではなく、構造体メンバー アクセス演算子です)。

あなたが言う時:

newItem->_stringValue

_stringValuenewItem が指すオブジェクトのインスタンス変数に直接アクセスしています。

この->演算子は C++ では非常に一般的ですが、Objective-C ではそれほど多くはありません。

于 2012-09-24T21:16:24.223 に答える
2

Objective C では、C++ と同様に、p->m 表記は (*p).m と同等です。これは、基本型へのポインターの逆参照とそれに続く対応するメソッドまたはプロパティの呼び出しです。

したがって、あなたの場合、他の表記法を使用すると、次のようになります。

(*newItem)._stringValue = [_stringValue copy];

( -> 演算子を使用する方が一般的です)

于 2012-09-24T21:17:52.613 に答える
2

Objective-C には、ある種の 2 つの変数型アクセサーがあります。誰もが知っておくべき"."ものは (例: Class.variable) です。この型は、適切な getter または setter を呼び出します。

さて、もう 1 つのタイプ (あなたが求めたもの) はクラス内での使用用です。明らかに、getter または setter は"."記法で自動的に呼び出されるため、setter なしで変数を設定する方法が必要です (setter 自体で setter を呼び出すと、無限ループが発生します)。したがって、この"->"表記法を使用します → 簡単に言えば、直接アクセス モードです。

通常、Objective-C の両方の表記の変数名は同じですが、クラス内表記の変数名を で始めることを好む人もいます"_"@synthesize variableこれは、行を に編集することによって実現され@synthesize variable = _variableます。

于 2012-09-24T21:19:08.147 に答える