56

selfを呼び出すときにアンダースコアを使用することと、Objective-C でキーワードを使用することに違いはあり@propertyますか?

プロパティ宣言:

@property (weak, nonatomic) NSString *myString;

@synthesizeプロパティの呼び出し:

@synthesize myString = _myString;

コードで使用したい場合、違いはありますか? いつ?ゲッター/セッターで?

self.myString = @"test";
_myString = @"test";
4

4 に答える 4

84

self.myString = @"test";は、 を書くこととまったく同じ[self setMyString:@"test"];です。これらは両方ともメソッドを呼び出しています。

あなたはそのメソッドを自分で書くことができたでしょう。次のようになります。

- (void)setMyString:(NSString*)newString
{
    _myString = newString;
}

を使用したため@synthesize、実際にそのメソッドを記述する必要はありません。コンパイラにそれを記述させることができます。

そのメソッドを見ると、それを呼び出すとインスタンス変数に値を代入するのとまったく同じことが行われるように見えますよね? まあ、それはそれほど単純ではありません。

まず、独自のセッター メソッドを作成できます。そうすると、メソッドが呼び出され、変数の設定だけでなく、あらゆる種類の追加処理を実行できます。その場合、使用self.myString =するとメソッドが呼び出されますが、実行すると呼び出さ_myString =れないため、別の機能が使用されます。

次に、Key Value Observing を使用したことがある場合、コンパイラは非常に巧妙なトリックを実行します。舞台裏では、クラスをサブクラス化し、setter メソッド (自分で作成したものか、synthesize によって生成されたものかに関係なく) をオーバーライドして、willChangeValueForKey:Key Value Observing が機能するために必要な呼び出しを行います。これがどのように機能するかを知る必要はありません (就寝前の読書が必要な場合は非常に興味深いですが!)、Key Value Observing を自動的に機能させたい場合は、setter メソッドを使用する必要があることを知っておく必要があります。

第 3 に、セッター メソッドを作成するために合成に依存している場合でも、セッター メソッドを呼び出すと、将来の柔軟性が得られます。値が変更されるたびに何か特別なことをしたい場合があり、それをしたいことがわかった時点で、setter メソッドを手動で書くことができます。常に を使用する習慣がある場合は、self.myString =その必要はありません。コードの残りの部分を変更して、新しいメソッドの呼び出しを開始します。

第 4 に、同じことがサブクラスにも当てはまります。他の誰かがあなたのコードをサブクラス化する場合、セッターを使用すると、セッターをオーバーライドして機能を調整できます。

インスタンス変数に直接アクセスするときはいつでも、その時点で追加機能をフックする方法を明示的に提供していません。あなたや他の誰かが将来そのような機能をフックしたいと思うかもしれないので、そうしない正当な理由がない限り、常にセッターを使用することは有益です。

于 2012-04-26T12:49:01.227 に答える
9

最初のバージョン ( self.myString) は合成されたゲッター/セッターを呼び出し、2 番目のバージョンはプライベート メンバー変数に直接アクセスします。

ARCを使用しているように見えるので、その場合はそれほど違いはありません。ただし、ARC を使用していない場合は、プライベート メンバーに直接割り当てても、 を使用して生成される自動保持/解放またはコピー/解放ロジックがトリガーされないため、違いが生じる可能性がありますsynthesize

于 2012-04-26T12:37:48.140 に答える
3

この質問_で説明されているように、(アンダースコア)は単なる慣習です。

プロパティ アクセスの前に を付けない場合はself.、 ac のように、基になる変数に直接アクセスしていますstruct。一般に、これは init メソッドとカスタム プロパティ アクセサーでのみ行う必要があります。これにより、計算されたプロパティやKVCなどを意図したとおりに機能させることができます。

于 2012-04-26T13:07:56.747 に答える