1

これは、Apple の「初めての iOS アプリケーション」ドキュメントのコード スニペットです。

- (IBAction)changeGreeting:(id)sender {

self.userName = textField.text;

NSString *nameString = self.userName;
if ([nameString length] == 0) {
    nameString = @"World";
}
NSString *greeting = [[NSString alloc] initWithFormat:@"Hello, %@!", nameString];
label.text = greeting;
[greeting release];
}

self.username が合成された set メソッドを呼び出すことを理解しています (コピー フラグがあるため重要です)。

textField.text と label.text が self.textField.text と self.label.text ではないのはなぜですか。

2つは同等ですか?既に get メソッドにアクセスするドット表記が既に存在するため、 self は不要ですか?

4

4 に答える 4

2

いいえ、同じではありません。指定したコードでは、にtextField.text変換されます[textField text]。つまり、 ivartextが指すオブジェクトのプロパティを取得します。一方、はに変換されます。つまり、現在のオブジェクトのアクセサーを呼び出し、結果のアクセサーを呼び出します。textFieldself.textField.text[[self textField] text]textFieldtext

最終結果は通常同じであるはずです。ivarとプロパティの両方に名前textFieldが付けられ、プロパティがivar以外のものを返すようにするのは少し奇妙です。

2つは同等ですか?getメソッドにアクセスするドット表記がすでに存在するので、自己は不要ですか?

上で説明したように、結果は似ていますが、意味が異なります。アクセサー(つまりself.textField.text)を使用するのが好ましいスタイルですが、すべての前に接頭辞を付けるself.のも少し面倒に思えるかもしれません。プロパティを繰り返し使用する場合の1つの可能な解決策は、プロパティアクセサーを一度呼び出して、結果をローカル変数に保持することです。

于 2011-05-31T15:43:10.540 に答える
2

はい:合成された getter は単にテキスト フィールドを返すため、この場合textField.textと同等です。self.textField.textおそらくAppleは、コードを読みやすくしたいので、簡潔にしたいと考えています。ただし、私はあなたのアプローチを支持します。プロパティを使用すると、カスタマイズしたい場合に備えて、アクセサー メソッドに固執するのは良い習慣です。

プロパティは、内部変数とは別のエンティティであることに注意してください。Apple のスタイルでは、両方に同じ名前を付けますが、一部のプログラマーは、内部変数にアンダースコアのプレフィックスを付けて 2 つの概念を分離することを好みます。その場合、_textField.textここで と同じ結果が得られself.textField.textます。しかし、2 つ目はテキスト フィールド用にクラスの生成された getter メソッドにアクセスすることです。1 つ目は、内部変数に直接アクセスするクラス内部コードの一部としての権利を行使することです。

于 2011-05-31T14:26:54.827 に答える
0

はい、どちらも同じです。同じオブジェクトを指しているので、self.label.text または label.text (どちらか) を使用できます。

于 2011-05-31T14:28:52.887 に答える
-1

あなたはそれを自分で言いました、それ以来、それらは同等でself.labelありlabel、同じオブジェクトを指します。

より明確にするためにバージョンを使用したいself.labelのですが、それは完全にコーディングの慣習です。

self.labelメソッド(無料ではありません)を呼び出しているため、使用時にパフォーマンスが低下することを指摘することが重要です。ただし、ほとんどの読み取り世界のケースでは、パフォーマンスへの影響は目立ちません(知っておくとよいでしょう)。

于 2011-05-31T14:25:30.250 に答える