objcの関連参照でUIViewにプロパティを追加してみる。

objectivecの関連参照を試したのでメモ。
UIView拡張で試したサンプル(github)


objcのカテゴリではインスタンス変数の追加はできない。
関連参照をつかえば疑似的に変数を追加できる。


必要な手順。
1. objc/runtime.hのインポート

#import



2. 追加する変数を保持する為のキーの準備 (voidポインタならOK)

// キーの一例
static char showRectKey; // 表示フレーム用のキー
static char hideRectKey; // 非表示フレーム用のキー



3. 関連オブジェクトの設定/クリア
objc_setAssociatedObject関数で設定する。
objectは参照を追加する対象、keyはキー、valueは追加するオブジェクト、policyはretainとか。
関連を解消する時はvaluenilをセットする。

void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)



関連オブジェクトの設定例

// 表示フレームの保持
- (void)setShowFrame:(CGRect)inFrame
{
    NSValue *value = [NSValue valueWithCGRect:inFrame];
    objc_setAssociatedObject(self, &showRectKey,
                             value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}



[参考]
UIView拡張で試したサンプル(github)
Objective-Cプログラミング言語_関連参照
詳解Objective-C 2.0 第3版 (アフリエイトリンクです。)