3

私はObjective-Cプログラミング言語でより詳細に理解しようとしています。

今、[self]値を設定するときの呼び出しについて質問があります。

Appleのドキュメントには、「selfを使用しない場合は、インスタンス変数に直接アクセスします。(...)」と記載されています。

したがって、インスタンス変数を持つ犬のオブジェクトがあると仮定しますNSString *name

[self]キーワードを使用せずに、次のようにそのインスタンス変数のセッターを作成します。

(void)setName:(NSString *)_name
{
  name = _name;
}

または、[self]キーワードを使用してセッターを作成すると、次のようになります。

(void)setName:(NSString *)_name
{
  self->name = _name;
}

mainメソッドで、新しいdogオブジェクトを作成し、その名前の値を設定して返します。

Dog *myDog = [[Dog alloc] init];

myDog.name = @"Yoda";

NSLog(@"name of the dog: %@", myDog.name);

どちらの場合も、Yodaの戻り値を取得します。しかし、技術的に[self]がある場合とない場合のインスタンス変数呼び出しの違いはどこにありますか?セッターメソッドを使用せずに同じ変数(メモリ)を呼び出すのですか?

4

2 に答える 2

1

selfはオブジェクト自体への暗黙的な参照であり、通常、パラメーターとインスタンス変数が同じ名前の場合にのみ、実際に指定する必要があります。たとえば、次のような場合です。

(void)setName:(NSString *)name
{
  self->name = name;    // self used here to differentiate between param and ivar
}

ただし、命名規則とメソッドの実装には注意する必要があります。

  1. 通常、先頭のアンダースコアは、メソッドに渡されるパラメーターではなく、インスタンス変数に名前を付けるための規則として使用されます。
  2. オブジェクトを設定するにはNSString *、通常、オブジェクトretainの所有権を取得し、解放されないようにする必要があります (後でアクセスすると例外が発生します)。

したがって、setNameメソッドは次のようになります。

// _name is the instance variable
- (void)setName:(NSString *)name
{
    [name retain];
    [_name release];
    _name = name;
}

これは、ARC ではなく MRR を使用している場合にのみ当てはまりますが、それを指定していないため、MRR を使用していると想定します。

于 2012-07-31T11:00:06.043 に答える
1

2 つの例に違いはありません。どちらの場合も、インスタンス変数を直接変更しています。

self.name自分でセッターメソッドを使う意味です[self setName:someValue];

self->nameインスタンス変数にアクセスしていることを意味するだけなので、

self->ivar = someVal;
//is the same as
ivar = someVal;
于 2012-07-31T10:50:14.613 に答える