3

私は iOS 開発の初心者で、現在、Simon Allardice による iOS SDK Essential Training に関する Lynda のチュートリアル、「Creating quick connections」の章に従っています。

ビルド時に次のエラー メッセージが表示されます。

「宣言されていない識別子 'myTextfield' の使用; '_myTextfield' のことですか?」

エラー メッセージは、次のコード行を示しています。

- (IBAction)changeLabel:(id)sender
{
    NSString *message = [[NSString alloc] initWithFormat:@"Hello %@",   myTextfield.text];
}

変数 "myTextfield" (スペルは正しく、アンダースコアはありません) は、関連するヘッダー ファイルで明確に宣言されています。

@property (weak, nonatomic) IBOutlet UITextField *myTextfield;

変数名の前にアンダースコアを付けるという提案に当惑しています。それでも、この推奨に従えば、コードはコンパイルされます。

MacBook Pro の Lion で Xcode 4.6.3 を使用しています。

誰かこの謎の解決策を教えてください。

4

2 に答える 2

1

プロパティは、ivar によってサポートされるセッター メソッドとゲッター メソッドです。暗黙的に合成されたプロパティを作成すると、対応する ivar が先頭のアンダースコアで作成されます。これは、プロパティ経由ではなく ivar に直接アクセスしていることを思い出させるためです。

これは、ivar への直接アクセスが非 ARC コードでは行われないのに対し、プロパティがメモリ管理を行うためです。また、プロパティは通知を監視するキー値の投稿を処理します。値を直接変更する場合は、KVO 通知を自分で処理する必要があります。さらに、プロパティはセッターまたはゲッターをオーバーライドして副作用を作成する場合があります (たとえば、ビューに文字列を設定する場合、ビューを再度描画する必要があるとマークするなど)。これらの副作用は、直接アクセスによって引き起こされることはありません。

init メソッドと dealloc メソッドでは、ivarに直接アクセスする必要があります。一般に、他のすべてのアクセスは setter メソッドと getter メソッドを介して行う必要があり[self setMyTextfield:]ます。self.myTextfield

私が奇妙に感じる動作の 1 つは、実装ファイルに追加してプロパティを明示的に合成すると、作成される ivarの先頭にアンダースコアが付かないことです。@synthesize myTextfield;

プロパティ、ivar、setter メソッドの詳細については、この件に関する Apple の Objective-C のドキュメントをお読みください。

于 2013-08-24T16:56:55.900 に答える