Xcode 4では、@propertyはゲッターメソッドとセッターメソッドの宣言しか生成できません;
Xcode 5 から、 自動的に _propertyName メンバ変数とゲッター、セッターメソッドの宣言と実装を生成することができます。デフォルトでは、ゲッター、セッターメソッドは _propertyName 変数に作用します。
しかし、getterメソッドとsetterメソッドの両方がオーバーライドされると、デフォルト変数_propertyNameに対応できない完全なカスタム実装が実現され、_propertyNameは無効になり、手動で変数を定義するか、プロパティにバインドするために@synthesizeを使用して変数を指定する必要があります。
I. 変数の手動定義
Girl.h
#import <Foundation/Foundation.h>
@interface Girl : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *boyFriend;
@end
ガールエム
#import "Girl.h"
@implementation Girl
/* *************** MARK: 方法1*************** */
{
NSString* _name; //変数を手動で登録する
}
- (NSString *)name{
if (!_name) {
_name = @"tanakali";
}
return _name;
}
- (void)setName:(NSString *)name{
_name = name;
}
@end
変数を手動で定義しに行かなければ、ゲッターやセッターだけを書くのは問題ありませんが、同時に書き直すとエラーになります。
/* *************** MARK: 方法2*************** */
@synthesize boyFriend = man; // @synthesize,属性を変数
- (NSString *)boyFriend {
if (!man) {
man = @"Jerod";
}
return man;
}
- (void)setBoyFriend:(NSString *)boyFriend{
man = boyFriend;
}
boyFriend 属性はもともと _boyFriend 変数に対応しており、ここでは属性、ゲッター、セッターに対応する変数が @synthesize によって変更されています。