iOS開發中runtime的使用

2021-07-24 07:01:58 字數 2992 閱讀 9574

事實證明:

1.傳送訊息

@implementation

viewcontroller

- (void)viewdidload

@end

@implementation

uiimage (image)

// 載入分類到記憶體的時候呼叫

+ (void)load

####注意: 不能在分類中重寫系統方法imagenamed,因為會把系統的功能給覆蓋掉,而且分類中不能呼叫super.

// 既能載入又能列印

+ (instancetype)imagewithname:(nsstring *)name

return image;

}@end

@implementation

viewcontroller

- (void)viewdidload

@end

@implementation

person

// void(*)()

// 預設方法都有兩個隱式引數,

void eat(id

self,sel sel)

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

// 剛好可以用來判斷,未實現的方法是不是我們想要動態新增的方法

+ (bool)resolveinstancemethod:(sel)sel

return [super resolveinstancemethod:sel];

}@end

@implementation

viewcontroller

- (void)viewdidload

@end

// 定義關聯的key

static

const

char *key = "name";

@implementation

nsobject (property)

- (nsstring *)name

- (void)setname:(nsstring *)name

@end

@implementation

nsobject (log)

// 自動列印屬性字串

+ (void)resolvedict:(nsdictionary *)dictelse

if ([obj iskindofclass:nsclassfromstring(@"__nscfarray")])else

if ([obj iskindofclass:nsclassfromstring(@"__nscfnumber")])else

if ([obj iskindofclass:nsclassfromstring(@"__nscfdictionary")])

// 屬性字串

nsstring *str;

if ([type containsstring:@"ns"]) else

// 每生成屬性字串,就自動換行。

}];// 把拼接好的字串列印出來,就好了。

nslog(@"%@",strm);

}@end

字典轉模型的方式一:kvc

@implementation

status

+ (instancetype)statuswithdict:(nsdictionary *)dict

@end

kvc字典轉模型弊端:必須保證,模型中的屬性和字典中的key一一對應。

如果不一致,就會呼叫[0x7fa74b545d60> setvalue:forundefinedkey:] 報key找不到的錯。

分析:模型中的屬性和字典的key不一一對應,系統就會呼叫setvalue:forundefinedkey:報錯。

解決:重寫物件的setvalue:forundefinedkey:,把系統的方法覆蓋, 就能繼續使用kvc,字典轉模型了。

- (void)setvalue:(id)value forundefinedkey:(nsstring *)key

字典轉模型的方式二:runtime

思路:利用執行時,遍歷模型中所有屬性,根據模型的屬性名,去字典中查詢key,取出對應的值,給模型的屬性賦值。

步驟:提供乙個nsobject分類,專門字典轉模型,以後所有模型都可以通過這個分類轉。

@implementation

viewcontroller

- (void)viewdidload

// 測試資料

nslog(@"%@ %@",_statuses,[_statuses[0] user]);

}@end

@implementation

nsobject (model)

+ (instancetype)modelwithdict:(nsdictionary *)dict

; // 用乙個ivar *指標指向陣列第乙個元素

ivar *ivarlist = a;

// 根據指標訪問陣列第乙個元素

ivarlist[0];

*/unsigned

int count;

// 獲取類中的所有成員屬性

ivar *ivarlist = class_copyivarlist(self, &count);

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

} // **轉換:nsarray中也是字典,把陣列中的字典轉換成模型.

// 判斷值是否是陣列

if ([value iskindofclass:[nsarray class]])

// 把模型陣列賦值給value

value = arrm;}}

if (value)

}return objc;

}@end

結束語:分享是每個優秀的程式設計師所必備的品質

iOS開發中Runtime的實際應用

runtime是objective c的乙個固有特性,及在編譯階段並不能確定真正呼叫的函式名,函式的呼叫在執行時才得到確認。所以我們可以看到,oc在編譯階段沒有報錯的情況下,會在執行過程中出現閃退和崩潰的錯誤,而c語言在編譯過程中就會報錯。ios的錯誤處理 編譯未出報錯,執行卻閃退 動態呼叫特性 c...

iOS開發 runtime機制

runtime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於c語言,函式的呼叫在編譯的時候會決定呼叫哪個函式 c語言的函式呼叫請看這裡 編譯完成之後直接順序執行,無任何二義性。oc的函式呼叫成為訊息傳送。屬於動態呼叫過程。在編譯的時候並不能決定真正呼叫哪個函式 事實證明,在...

iOS開發 runtime的基本使用

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