読者です 読者をやめる 読者になる 読者になる

Pychef's Diary

I consider myself an engineer, aren't I?

Objective-Cの「インスタンス変数」と「プロパティ」の違い

Objective-Cを始めてから、最初に戸惑ったのが「インスタンス変数(ivar)」と「プロパティ(プロパティ変数)」の違いです。

結論からいうと、「プロパティ」 = 「インスタンス変数 」+ アクセサ」のようです。

理由としては、レガシィな書き方(Objective-C 1.0)では下記のようにヘッダファイル(.h)にインスタンス変数を宣言し、その変数用にアクセサを用意し、その後、実装ファイル(.m)でセッター・ゲッターを記述する必要がありました。

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{
    //インスタンス変数
    NSString *name;
}

//インスタンス変数用ゲッター
- (NSString *)returnName;

//インスタンス変数用セッター
- (void)setName:(NSString *)name;

@end


このままでは面倒臭いので(?)、モダンな書き方(Objective-C 2.0←イマココ!)では「プロパティ」という概念が使われるようになりました。
下記の通り、@property~ で宣言して、.(ドット)や_(アンダースコア)でアクセスするだけでゲットもセットもできます。

#import "ViewController.h"

@interface ViewController ()
@property NSString *name;
@end

@implementation ViewController{
    NSString *ivarString;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.propertyString = @"this is self-accessed property";
    NSLog(@"%@", self.propertyString);
    
    _propertyString = @"this is underscore-accessed property";
    NSLog(@"%@", _propertyString);

}

「プロパティ」を宣言すると、インスタンス変数とアクセサも自動的に生成されます。

ドットでアクセスすると、アクセサ経由。アンダースコアでアクセスすると、直接インスタンス変数を書き換えるようです。

以上