サンプルコードの多くの場所で、@synthesize変数の2つの異なる方法を見てきました。たとえば、ここでは1つのサンプルボタンを使用しています。@property(strong、nonatomic)IBOutlet UIButton * loginButton;
1.@synthesizelogonButton = _logonButton;
2.@synthesizelogonButton;
この2つの方法のうち、どちらが推奨されますか?
サンプルコードの多くの場所で、@synthesize変数の2つの異なる方法を見てきました。たとえば、ここでは1つのサンプルボタンを使用しています。@property(strong、nonatomic)IBOutlet UIButton * loginButton;
1.@synthesizelogonButton = _logonButton;
2.@synthesizelogonButton;
この2つの方法のうち、どちらが推奨されますか?
短い答え
最初の方法が推奨されます。
長い答え
最初の例は、プロパティに対して生成されたivarは、プロパティ()と同じ名前を持つデフォルトの生成されたivarの代わりに使用するlogonButton
必要があることを宣言しています。_logonButton
logonButton
これの目的は、メモリの問題を防ぐのに役立つことです。誤ってオブジェクトをプロパティではなくivarに割り当てた場合、そのオブジェクトが保持されず、アプリケーションがクラッシュする可能性があります。
例
@synthesize logonButton;
-(void)doSomething {
// Because we use 'self.logonButton', the object is retained.
self.logonButton = [UIButton buttonWithType:UIButtonTypeCustom];
// Here, we don't use 'self.logonButton', and we are using a convenience
// constructor 'buttonWithType:' instead of alloc/init, so it is not retained.
// Attempting to use this variable in the future will almost invariably lead
// to a crash.
logonButton = [UIButton buttonWithType:UIButtonTypeCustom];
}
プロパティに対して自動的に生成されたset/getメソッドが、異なる名前(_logonButton)のivarを使用していることを意味します。
-(void)setLogonButton:(UIButton)btn {
_logonButton = [btn retain]; // or whatever the current implementation is
}
プロパティに対して自動的に生成されたset/getメソッドが、同じ名前のlogonButtonを持つivarを使用していることを意味します。
-(void)setLogonButton:(UIButton)btn {
logonButton = [btn retain]; // or whatever the current implementation is
}