天天看點

iOS動态增加屬性import import “objc/runtime.h”import “UILabel+flashClolr.h”

如何給對象增加執行個體變量?我們都知道用category可以給已經存在的類增加方法,但是無法給已經存在的類增加執行個體變量。系統提供了associative references,這個問題就很容易解決了。這個方法就是所謂的關聯(association),我們可以在runtime期間動态給對象添加任意多的屬性,并且能任意讀取。這裡用的了兩個重要的API:

  1. OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key,

    id value, objc_AssociationPolicy policy)

    __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

2.

OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)

__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

我們用一個執行個體來說明一下:給UILabel用category增加一個屬性,一個FlashColor。我們有一個原則:能用category就不用繼承,因為随着繼承深度的增加,代碼的可維護性也會增加很多。下面是源碼:

第一步:建立一個分類 如下圖

iOS動态增加屬性import import “objc/runtime.h”import “UILabel+flashClolr.h”

第二步:添加檔案名

iOS動态增加屬性import import “objc/runtime.h”import “UILabel+flashClolr.h”

生成一個類

iOS動态增加屬性import import “objc/runtime.h”import “UILabel+flashClolr.h”

.h檔案

import

import “objc/runtime.h”

@interface UILabel (flashClolr)

@property(nonatomic, retain) NSString *FlashColor;

- (NSString *) getFlashColor;

@end

.m檔案

import “UILabel+flashClolr.h”

@implementation UILabel (flashClolr)

@dynamic FlashColor;

static char flashColorKey;

  • (void)setFlashColor:(NSString *)flashColor

    {

    objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    }

  • (NSString *) getFlashColor{

    return objc_getAssociatedObject(self, &flashColorKey);

    }

    @end