runtime的五種便捷使用

2021-08-15 11:31:12 字數 3749 閱讀 7549

通過runtime獲取模型的屬性,然後通過kvc來進行賦值。

#import "nsobject+category.h"

#import @implementation nsobject (category)

+ (nsarray *)propertlist

//釋放屬性組

free(propertylist);

return arr.copy;

}+ (instancetype)modelwithdict:(nsdictionary *)dict

}return obj;

}@end

使用

nsdictionary *dic = @;

_bean = [testbean modelwithdic:dic];

其實就是你通過selector呼叫方法a時,通過swizzling使得你呼叫的時方法b

+(void)load
使用

[testbean load];

[_bean printa]

[_bean printb];

#import "nsobject+extension.h"

#import @implementation nsobject (extension)

//用於存放屬性的變數,多個屬性,需要建立不同的變數

char bookkey;

-(void)setbooks:(nsarray *)books

-(nsarray *)books

@end

使用

[_bean setbooks:@[@(1),@(2),@(3)]];

nsarray * array = [_bean books];

nslog(@"%@",[array objectatindex:2]);

#import #import #import @inte***ce nsobject (zzwmodel)

#pragma mark - nsinvocation (不限引數)

/** *例項方法

*/+(id)msgsendtoobj_invocation:(id)obj selector:(sel)selector prarms:(nsarray*)params needreturn:(bool)needreturn;

/** *類方法

*/+(id)msgsendtoclass_invocation:(class)ysclass selector:(sel)selector prarms:(nsarray*)params needreturn:(bool)needreturn;  

@end

#import "nsobject+zzwmodel.h"

@implementation nsobject (zzwmodel)

#pragma mark - nsinvocation (不限引數)

+(id)msgsendtoobj_invocation:(id)obj selector:(sel)selector prarms:(nsarray*)params needreturn:(bool)needreturn

[invocation invoke];//perform 的傳參表達方式

if(needreturn)

}else

}return value;

}+(id)msgsendtoclass_invocation:(class)ysclass selector:(sel)selector prarms:(nsarray*)params needreturn:(bool)needreturn

[invocation invoke];//perform 的傳參表達方式

if(needreturn)

}else

return value;

}@end

使用方法

[nsobject msgsendtoobj_invocation:person selector:nsselectorfromstring(@"eat") prarms:nil needreturn:no];

[nsobject msgsendtoclass_invocation:nsclassfromstring(@"person") selector:nsselectorfromstring(@"eat") prarms:nil needreturn:no];

//[nsobject msgsendtoobj_invocation:person selector:nsselectorfromstring(@"sleepofhour:") prarms:@[@(10)] needreturn:no];

[nsobject msgsendtoclass_invocation:nsclassfromstring(@"person") selector:nsselectorfromstring(@"sleepofhour:") prarms:@[@(8)] needreturn:no];

//id objr_in = [nsobject msgsendtoobj_invocation:person selector:nsselectorfromstring(@"eatenough:") prarms:@[@(100)] needreturn:yes];

id classr_in = [nsobject msgsendtoclass_invocation:nsclassfromstring(@"person") selector:nsselectorfromstring(@"eatenough:") prarms:@[@(100)] needreturn:yes];

nslog(@"objr_in_%@ classr_in_%@", objr_in, classr_in);

說的是如果呼叫方法a,如果方法a只是在.h申明而沒有在.m裡實現,那就呼叫預設方法提示該方法沒有實現並防止崩潰

首先在`person`類中

在.h中宣告兩個方法,但不去實現:

-(void)unknowsel_obj;

+(void)unkonwsel_class;

在.m中實現這兩個方法:

-(void)noobjmethod

+(void)noclassmethod

並且重寫訊息**的方法:

// 當乙個物件呼叫未實現的方法,會呼叫這個方法處理,並且會把對應的方法列表傳過來.

//注意:例項方法是存在於當前物件對應的類的方法列表中

+(bool)resolveinstancemethod:(sel)sel

// 當乙個類呼叫未實現的方法,會呼叫這個方法處理,並且會把對應的方法列表傳過來.

//注意:類方法是存在於類的元類的方法列表中

+(bool)resolveclassmethod:(sel)sel

在vc中呼叫未實現的兩個方法:

person* person = [[person alloc] init];

[person unknowsel_obj];

[person unkonwsel_class];

使用

[_bean unkownsel_obj];

參考文章

Ember Zigbee CLI的使用與便捷除錯

針對simplicity studio 4,emberznet協議棧使用cli實現對zigbee的function的呼叫與便捷除錯 platform simplicity studio 4 emberznet sdk 6.4.1.0 spp content 1 配置printing and cli欄...

iOS開發中runtime的使用

事實證明 1.傳送訊息 implementation viewcontroller void viewdidload end implementation uiimage image 載入分類到記憶體的時候呼叫 void load 注意 不能在分類中重寫系統方法imagenamed,因為會把系統的功...

iOS開發 runtime的基本使用

runtime的基本使用 1,動態改變例項變數的值 2,交換方法 3,動態新增方法 4,使用runtime為分類新增屬性 1,動態改變例項變數的值 1,動態改變屬性值 void change value name 3,動態新增方法 3,使用runtime 動態新增方法 void add method...