runtime綁定屬性方法字典轉(zhuǎn)模型

runtime動態(tài)綁定屬性??

首先創(chuàng)建一個分類以NSString為例

在NSString+apping.h? 中加入了一個number屬性

@interface NSString (apping)

@property(nonatomic, assign) NSInteger number;

@end

NSString+apping.m中? 用關(guān)鍵字@dynamic修飾number屬性? @dynamic的作用蘋果文檔翻譯后的意思大概是:您可以使用@ dynamic關(guān)鍵字告訴編譯器,您將通過直接或在運行時使用其他機(jī)制(例如動態(tài)加載代碼或動態(tài)方法解析)來實現(xiàn)由屬性所隱含的API契約。它抑制了如果編譯器無法找到合適的實現(xiàn),則會生成的警告。您應(yīng)該只使用它,如果您知道方法將在運行時可用。 因為是動態(tài)綁定需要導(dǎo)入objc/runtime頭文件,具體實現(xiàn)如下

#import <objc/runtime.h>

@dynamic number;

static char stringNumber;

- (void)setNumber:(NSInteger)number{

objc_setAssociatedObject(self, &stringNumber, [NSString stringWithFormat:@"%ld",number], OBJC_ASSOCIATION_COPY);

}

- (NSInteger)number{

return [objc_getAssociatedObject(self, &stringNumber) integerValue];

}


runtime實現(xiàn)字典轉(zhuǎn)模型

創(chuàng)建名為person的Model類添加字典轉(zhuǎn)換方法

Person.h

@interface Person : NSObject

@property(nonatomic, copy)NSString *name;

@property(nonatomic, copy)NSString *phone;

@property(nonatomic, assign)NSInteger sex;

@property(nonatomic, copy)NSString *age;

+ (instancetype)modelWithDic:(NSDictionary*)dic;


Person.m

#import <objc/runtime.h>

//字典轉(zhuǎn)模型


+ (instancetype)modelWithDic:(NSDictionary*)dic{

id objc = [[self alloc] init];

unsigned int count = 0;

Ivar *ivarList = class_copyIvarList(self, &count);

for (int i = 0; i < count; i ++) {

Ivar ivar = ivarList[i];

NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];

NSString *key = [ivarName substringFromIndex:1];

id value = dic[key];

if (value) {

[objc setValue:value forKey:key];

}

}

return objc;

}


runtime動態(tài)修改屬性值

在ViewController.m中導(dǎo)入Person? 創(chuàng)建一個person屬性

@interface ViewController ()

@property(nonatomic, strong)Person *person;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.


_person = [Person modelWithDic:@{@"name":@"niyuanbo", @"phone":@"18883278185", @"sex":@1, @"age":@"33"}];

[self change];

//打印出的age為30

NSLog(@"%@, %@? %ld %@", _person.name, _person.phone,_person.sex,_person.age);



}

- (void)change{

unsigned int count = 0;

Ivar *ivar = class_copyIvarList([self.person class], &count);

for (int i = 0; i < count; i ++) {

Ivar var = ivar[i];

const char *varname = ivar_getName(var);

NSString *name = [NSString stringWithUTF8String:varname];

if ([name isEqualToString:@"_age"]) {

object_setIvar(self.person, var, @"30");

break;

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 對于從事 iOS 開發(fā)人員來說,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,812評論 7 64
  • 第26屆世界腦力錦標(biāo)賽,中國總決賽于2017年11月19日,在大連體育中心圓滿結(jié)束。 寧夏銀川婦聯(lián)代表隊李瑩獲得兩...
    幸福腦李景林閱讀 1,637評論 1 0
  • 看到一句好玩的:一懶眾衫小,薪盡自然涼。就畫這個小品《布袋和尚參禪圖》。和尚金雞獨立,站在體重秤上,掛的布袋干癟無...
    意象工廠閱讀 768評論 0 2
  • 其實我每次想寫一段文字的時候,我總不知該如何提筆。寫了太多別人,我想寫寫我自己。 匆匆已是經(jīng)年,如果...
    青衫如故idiot閱讀 572評論 4 1
  • 美媽產(chǎn)后可進(jìn)行簡單的鍛煉 美媽產(chǎn)后可進(jìn)行簡單的鍛煉,分娩后,馬上開始。如果是剖腹產(chǎn),還是該休息4-6周 1、骨盆底...
    美媽錦囊閱讀 151評論 0 1

友情鏈接更多精彩內(nèi)容