事實證明:
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...