iOS動態增加屬性

如何給對象增加實例變量?我們都知道用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就不用繼承,因爲隨着繼承深度的增加,代碼的可維護性也會增加很多。下面是源碼:

第一步:新建一個分類 如下圖
這裏寫圖片描述

第二步:添加文件名
這裏寫圖片描述

生成一個類
這裏寫圖片描述

.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

發佈了16 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章