首先說明一下,直接在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 的方式,將乙個物件 關聯 到已有的要擴充套件的物件上。進行關聯後,在對這個目標物件訪問的時候,從外界看來,就似乎是直接在通過屬性訪...