Objective-Cでの関連付け(objc_setAssociatedObject,objc_getAssociatedObject,objc_removeAssociatedObject)

5105 ワード

関連概念
関連とは、文字通り2つの関連する対象を一緒に置くことを意味しますが、実際にはそうです.2つのオブジェクトを互いに関連付けて、そのうちの1つのオブジェクトが別のオブジェクトの一部になるようにします.これが関連です.
 
関連付けられた役割
Categoryを使用すると、クラスファイル自体を変更することなく、クラスにメソッドを追加できます.関連付けを使用すると、Categoryを使用するのと同じように、クラス以外のクラスに追加のストレージスペースを追加できます.クラスファイル自体を変更する必要はありません.関連付けはキーワードに基づいているので、任意のオブジェクトに任意の複数の関連付けを追加できます.各関連付けには異なるキーワードが使用されます.関連付けは、関連付けられたオブジェクトが関連付けられたオブジェクトのライフサイクル全体で使用可能であることを保証します(ゴミ自動回収環境でもリソースが回収できないことはありません).
 
関連付けの作成
関連付けを作成するにはObjcのランタイム関数を使用する必要があります:objc_setAssociatedOjbectは、あるオブジェクトを別のオブジェクトに関連付けるため、ヘッダファイルをインポートする必要があります.この関数には、ソースオブジェクト、キーワード、関連オブジェクト、関連ポリシーの4つのパラメータが必要です.
キーワードはvoidタイプのポインタです.各関連キーワードは一意でなければなりません.通常、キーワードとして静的変数が使用されます.
関連ポリシーは、関連するオブジェクトが付与、参照の保持、または付与によって関連付けられていることを示します.また、この関連は原子的なのか非原子的なのか.ここの関連ポリシーは、属性を宣言するときと似ています.この関連ポリシーは、予め定義された定数によって表される.
次のコードは、文字列を配列に関連付ける方法を示します.
    static char overViewKey;

    

    NSArray * array = [@[@"One",@"Two",@"Three"] retain];

    NSString * overView = [[NSString alloc] initWithFormat:@"First three number"];

    objc_setAssociatedObject(array, &overViewKey, overView, OBJC_ASSOCIATION_RETAIN);

    

    [overView release];//(1) overView      

    [array release]; //(2) overView   

(1)では、OBJC_ASSOCIATION_RETAINポリシーは、配列が関連するオブジェクトを持つことを示します.配列arrayが破棄されると,(2)ではoverViewも解放され,破棄される.この時点でoverViewを使用したい場合、たとえばNSLogでoverViewの値を出力したい場合は、例外が発生します.
 
関連オブジェクトの取得
関連するオブジェクトを取得する際にObjcの関数obc_を使用getAssociatedObject.
    NSString * associatedOjbect = (NSString *)objc_getAssociatedObject(array, &overViewKey);

 
関連の切断
関連付け解除時にobjc_を使用するsetAssociatedOjbect、nil値を入力します.次のようになります.
objc_setAssociatedObject(array, &overViewKey, nil, OBJC_ASSOCIATION_ASSIGN);

その中で、管理されているのはあなたのオブジェクトがnilで、この時の関連戦略も重要ではありません.
関数objc_の使用removeAssociatedOjbectsは、すべての関連付けを解除できます.通常、この関数はすべての関連付けが切断されるため、推奨されません.この関数は、オブジェクトを元の状態に戻す必要がある場合にのみ使用されます.
 
完全なサンプルプログラム
#import <Foundation/Foundation.h>

#import <objc/runtime.h>



int main(int argc, const char * argv[])

{



    @autoreleasepool {

        

        static char overviewKey;

        NSArray * array = [@[@"One",@"Two",@"Three"] retain];

        NSString * overview = [[NSString alloc] initWithString:@"First three nubmers"];

        objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);

        [overview release];

        

        NSString * associatedObject = (NSString *)objc_getAssociatedObject(array, &overviewKey);

        NSLog(@"associatedObject:%@",associatedObject);

        

        objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);

        

        [array release];

        

        

    }

    return 0;

}

 
 
ソース:http://blog.csdn.net/onlyou930/article/details/9299169、若干の修正