1.傳送訊息
// 建立person物件
person *p = [[person alloc] init];
// 呼叫物件方法
[p eat];
// 本質:讓物件傳送訊息
objc_msgsend(p, @selector(eat));
// 呼叫類方法的方式:兩種
// 第一種通過類名呼叫
[person eat];
// 第二種通過類物件呼叫
[[person class] eat];
// 用類名呼叫類方法,底層會自動把類名轉換成類物件呼叫
// 本質:讓類物件傳送訊息
objc_msgsend([person class], @selector(eat));
2.交換方法
@implementation viewcontroller
- (void)viewdidload
@end
@implementation uiimage (image)
// 載入分類到記憶體的時候呼叫
+ (void)load
// 不能在分類中重寫系統方法imagenamed,因為會把系統的功能給覆蓋掉,而且分類中不能呼叫super.
// 既能載入又能列印
+ (instancetype)imagewithname:(nsstring *)name
return image;
}@end
3.動態新增方法
@implementation viewcontroller
- (void)viewdidload
@end
@implementation person
// void(*)()
// 預設方法都有兩個隱式引數,
void eat(id self,sel sel)
// 當乙個物件呼叫未實現的方法,會呼叫這個方法處理,並且會把對應的方法列表傳過來.
// 剛好可以用來判斷,未實現的方法是不是我們想要動態新增的方法
+ (bool)resolveinstancemethod:(sel)sel
return [super resolveinstancemethod:sel];
}@end
4.給分類新增屬性@implementation viewcontroller
- (void)viewdidload
@end
// 定義關聯的key
static const char *key = "name";
@implementation nsobject (property)
- (nsstring *)name
- (void)setname:(nsstring *)name
@end
5.字典轉模型
@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
@implementation status
+ (instancetype)statuswithdict:(nsdictionary *)dict
@end
- (void)setvalue:(id)value forundefinedkey:(nsstring *)key
@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
runtime簡單理解
runtime 執行時機制 首先必須明白的 1.是什麼 1 runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api 2 平時編寫的oc 在程式執行過程中,其實最終都是轉成了runtime的c語言 runtime算是oc的幕後工作者 下面這就是乙個例項,在前面的文...
RunTime的執行機制簡單使用
runtime 是一套比較底層的純c語言api 它是oc的幕後工作者 我們平時寫的oc 在執行時都會編譯器轉為runtime的c語言 其中最主要的是訊息機制oc的函式呼叫,成為訊息傳送 屬於動態呼叫過程 在編譯的時候並不能決定真正呼叫哪個函式事實證明,在編譯階段,oc可以呼叫任何函式,即使這個函式並...
runtime基本使用
用法詳見zjrtextfiled 什麼是runtime?1 runtime是一套底層的c語言api 包括很多實用的c語言型別,c語言函式 2 實際上,平時我們編譯的oc 底層都是基於runtime實現的 也就是說,我們平時編寫的oc 最終都是轉成了底層的runtime c語言 執行時 runtime...