Objective-Cの@synthesizeを自分で実装する

Objective-Cで@propertyと@synthesizeを使っていると、値を取得するタイミングや値を設定するタイミングでちょっとした処理をしたいことがある。ちなみに記事タイトルは正確ではなく、本記事はどちらかというと「Objective-Cでプロパティのセッターとゲッターの書き方」ぐらいのスタンスです。すみません。

MRC(Manual Reference Counting)の場合

「Cocoa Fundamentals Guide: サブクラスの基本的な設計」のアクセサメソッドを参考にした。

非オブジェクトインスタンス変数の場合

assign

@property (assign) float currentRate;

上記の@propertyと対応するgetter/setterは以下の通り。値をそのまま返すだけ、値をそのまま代入するだけでよい。

- (float)currentRate {
    return currentRate;
}

- (void)setCurrentRate:(float)newRate {
    currentRate = newRate;
}

オブジェクトインスタンス変数の場合

copy

@property (copy) NSString *title;

上記の@propertyと対応するgetter/setterは以下の通り。

- (NSString *)title {
    return [[title retain] autorelease];
}

 - (void)setTitle:(NSString *)newTitle {
    if (title != newTitle) {
        [title release];
        title = [newTitle copy];
    }
}

retain

@property (retain) UIView *originalView;

上記の@propertyと対応するgetter/setterは以下の通り。

- (UIView *)originalView {
    return originalView;
}

 - (void)setOriginalView:(UIView *)newOriginalView {
    if (originalView != newOriginalView {
        [originalView release];
        originalView = [newOriginalView retain];
    }
}

ARC(Automatic Reference Counting)の場合

「Transitioning to ARC Release Notes」の「Common Issues While Converting a Project」を参考にした。

本文中に”With ARC, instance variables are strong references by default—assigning an object to an instance variable directly does extend the lifetime of the object.“とある。つまり、インスタンス変数に代入するだけでstrong参照を持つのである。

- (id)thing {
    return _thing;
}

- (void)setThing:(id)thing {
    _thing = thing;
}

追記

2013年5月22日 10時32分
FYI:
Objective-C のプロパティ属性のガイドライン #Objective-C #Mac #iOS #Xcode – Qiita [キータ]


コメントを残す