@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;
@endXcode 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使うのがルールみたいなのはあんまりよくないと思う