Skip to content

Instantly share code, notes, and snippets.

@yashigani
Last active August 29, 2015 13:58
Show Gist options
  • Save yashigani/10426186 to your computer and use it in GitHub Desktop.
Save yashigani/10426186 to your computer and use it in GitHub Desktop.
Accessing instance variables in Objective-C

ivarpropertyの純情な関係

@yashigani

Objective-Cにおけるインスタンス変数

@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];
}

どう違うのか?

  • propertyaccsessorを自動生成する(実際には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使うのがルールみたいなのはあんまりよくないと思う

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment