iOS下Category新增屬性字段

2021-07-11 05:36:44 字數 2132 閱讀 9413

首先說明一下,直接在category中是不能新增屬性的,就算在.m檔案中實現了相應的getter和setter方法,呼叫的時候也是會報錯的。

首先看下報錯情況

1, 編寫category標頭檔案,以uiimage為例

//

// uiimage+category.h

//

//// created by linf on 15-5-19.

//#import

@inte***ce

uiimage (category)

// 在uiimage中新建乙個tag屬性

@property (nonatomic, copy) nsstring *tag;

@end

2,編寫category原始檔

//

// uiimage+category.m

//

//// created by linf on 15-5-19.

//#import "uiimage+category.h"

@implementation

uiimage (category)

- (nsstring *)tag

- (void)settag:(nsstring *)tag

@end

3, 訪問category新增的tag屬性

uiimage *image = [uiimage imagenamed:@""];

[image settag:@"100"];

nslog(@"tag:%@", [image tag]);

列印資訊為:

2015-08-12

15:17:10.321 informpub[16828:1373803] cuicatalog: invalid asset name supplied:

2015-08-12

15:17:10.321 informpub[16828:1373803] tag:(null)

看到了沒有,我們設定了tag值,完全沒有用。那麼有沒有什麼辦法可以給category新增屬性欄位呢?請看下面:

1,編寫category標頭檔案,還是以uiimage為例

//

// uiimage+category.h

//

//// created by linf on 15-5-19.

//#import

@inte***ce

uiimage (category)

// 在uiimage中新建乙個tag屬性

@property (nonatomic, copy) nsstring *tag;

@end

2,編寫category原始檔

//

// uiimage+category.m

//

//// created by linf on 15-5-19.

//#import "uiimage+category.h"

static

const

void *tagkey = &tagkey;

@implementation

uiimage (category)

- (nsstring *)tag

- (void)settag:(nsstring *)tag

@end

3, 訪問category新增的tag屬性

uiimage *image = [uiimage imagenamed:@""];

[image settag:@"100"];

nslog(@"tag:%@", [image tag]);

列印資訊為:

2015-08-12

14:57:58.777 informpub[16741:1271788] tag:100

到這裡**就新增完成了,category就可以新增屬性欄位了。這裡面用到了objective-c的runtime。如果有不了解runtime的小夥伴,可以參考以下**:

iOS為Category新增屬性

一般認為category不能新增變數,其實可以使用 dynamic 來動態新增的。即執行時runtime 分類裡面不能新增ivar是因為分類本身並不是乙個真正的類,它並沒有自己的isa。原文出自 1.建立uiviewcontroller的類別並新增幾個屬性 import inte ce uiview...

使用執行時機制向Category中新增屬性

簡明扼要 了解oc的都應該知道,在一般情況下,我們是不能向category中新增屬性的,只能新增方法,但有些情況向,我們確實需要向category中新增屬性,而且很多系統的api也有一些在category新增屬性的情況,例如我們屬性的uitableview的section和row屬性,就是定義在乙個...

swift之給拓展Category增加屬性

使用 category 擴充套件現有的類的功能的時候,直接新增例項變數這種行為是不被允許的,這時候一般就使用 property 配合 associated object 的方式,將乙個物件 關聯 到已有的要擴充套件的物件上。進行關聯後,在對這個目標物件訪問的時候,從外界看來,就似乎是直接在通過屬性訪...