@yashigani
@interface Person {
NSString *_firstname;
NSString *_lastname;
}
@property (copy) NSString *firstname;
@property (copy) NSString *lastname;
@property (readonly) NSString *fullname;
@end
@implementation Person
@synthesize firstname = _firstname;
@synthesize lastname = _lastname;
@end
Xcode 4
以降はivar
の宣言と@synthesize
を省略できる(これと同じ意味になる).
- (NSString *)fullname
{
// `ivar`の実態に直接アクセス
return [_firstname stringByAppendingString:_lastname];
// `property`を使ってアクセス
return [self.firstname stringByAppendingString:self.lastname];
}
property
はaccsessor
を自動生成する(実際にはivar
がある)property
を使ってアクセスする =accessor
を介してのアクセス
- (NSString *)lastname
{
return _lastname.uppercaseString;
}
- 基本的には
property
を使うべきという風潮 - 個人的には状況によってに使い分けるべきという考え
getter
をオーバーライドしてivar
をイニシャライズするパターンを良く使う
- (NSString *)firstname
{
if (!_firstname) {
_firstname = @"John";
}
return _firstname;
}
- (NSString *)lastname
{
if (!_lastname) {
_lastname = @"Doe";
}
return _lastname.uppercaseString;
}
- ライブラリやアプリ根幹のコンポーネントを作る場合,
accessor
をオーバーライドされると困ることがある- 逆にいうと,
property
経由でアクセスしている場合はサブクラスで変更してよいということ
- 逆にいうと,
インスタンス変数へのアクセスの仕方に関しては,意図をもって使い分けできるので,コーディングスタイルのレベルでproperty
使うのがルールみたいなのはあんまりよくないと思う