PS:首先我想聲明一下,該標(biāo)題包含了兩層意思,這也是我接下來要寫的兩個(gè)部分。
一.在某一個(gè)類中增加屬性
場景如下:比如我正在使用別人寫的IMSDK,里面有個(gè)類(IMUser),該類有屬性:jid、userID、userName,他們都做了數(shù)據(jù)庫存儲(chǔ)操作。但是假如他這3個(gè)屬性滿足不了我,我還需要一個(gè)屬性isSelected,用來判斷是否選中該用戶,而且是不需要存入數(shù)據(jù)庫的。那么,這時(shí)候我就可以寫一個(gè)分類來擴(kuò)展這么一個(gè)屬性。
.h文件中
#import "IMUser.h"
@interface IMUser(IMUserExt)
@property(nonatomic,assign) BOOL isSelected;
@end
.m文件中
#import "IMUserExt.h"
#import <objc/runtime.h>
@implementation IMUser(IMUserExt)
static const char *strIsSelectedKey = "strIsSelectedKey";
-(void)setIsSelected:(BOOL)isSelected
{
objc_setAssociatedObject(self, strIsSelectedKey, @(isSelected), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(BOOL)isSelectedf
{
NSNumber *number = objc_getAssociatedObject(self, strIsSelectedKey);;
return [number boolValue];
}
@end
以上使用了運(yùn)行時(shí)機(jī)制,而且擴(kuò)展的屬性是屬于IMUser的。
二.在某一個(gè)類的擴(kuò)展某一個(gè)屬性
其實(shí)以下這點(diǎn)主要講對字典屬性的擴(kuò)展,假如你是用IMSDK,不過慶幸的是IMSDK的維護(hù)者他眼光長遠(yuǎn),知道你也許會(huì)想要自己的屬性,這時(shí)候他就在IMUser這個(gè)類中給了一個(gè)屬性
//用戶屬性擴(kuò)展字段
@property(nonatomic,strong) NSMutableDictionary *userExt;
以上第一點(diǎn)講到的是他該類做了數(shù)據(jù)存儲(chǔ)操作,而且我用到的字段不需要存儲(chǔ)數(shù)據(jù)庫,所以用了第一種運(yùn)行時(shí)機(jī)制,但是現(xiàn)在我要用到一個(gè)屬性叫做email,而且是需要存儲(chǔ)到數(shù)據(jù)庫的。那我是不是可以把它加到userExt[@"email"]中呢?但問題是我每次用到都要這樣取值,如下:
IMUser *user = [IMUser alloc] init];
NSString *email = user.userExt[@"email"];
假如我想做到取值如下:
IMUser *user = [IMUser alloc] init];
NSString *email = user.email;
這樣是不是更方便,好,那就說說怎么對userExt進(jìn)行改造
.h文件
#import "IMUser.h"
@interface IMUser(IMUserExt)
@property(nonatomic,copy) NSString *email;
@end
.m文件
#import "IMUserExt.h"
@implementation TKIMUser(TKIMUserExt)
-(void)setEmail:(NSString *)email
{
self.userExt[@"email"] = email;
}
-(NSString *)email
{
return self.userExt[@"email"];
}
@end
重寫該屬性的setter和getter方法就可以了,是不是這么簡單,好high啊。