Runtime理解---方法調(diào)用和方法交換

Runtime:

runtime底層方法調(diào)用无午,正常項目中OC 是不希望你去調(diào)用底層代碼的瘪松,所以我們需要修改下配置文件(build settings 搜查msg 將bool修改為NO),之后創(chuàng)建一個Person類,并且創(chuàng)建一個eat方法?

具體實現(xiàn):https://github.com/liyunhe/RuntimeStudy

#import"Person.h"@implementationPerson-(void)eat{

? ? NSLog(@"調(diào)用我了");

}@end

利用 objc_msgSend調(diào)用eat方法

Person *p = [[Person alloc] init];

? objc_msgSend(p, @selector(eat));

下面我們嘗試不適用OC 上層代碼調(diào)用具體代碼如下

//創(chuàng)建對象NSObject* p = objc_msgSend(objc_msgSend(objc_getRequiredClass("Person"),@selector(alloc)),@selector(init)); ?//調(diào)用方法objc_msgSend(p,@selector(eat));

驗證是否是底層代碼?

1.創(chuàng)建一個command line Lauguage 選中OC??

2.利用終端cd到main.c所在目錄?

3.執(zhí)行clang -rewrite-objc main.m??

4.找到main.cpp?

如下是OC 底層實現(xiàn)代碼

int main(int argc, const char * argv[]) {

? ? /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;

? ? ? ? Person * p = ((Person *(*)(id, SEL))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init"));

? ? ? ? NSLog((NSString *)&__NSConstantStringImpl__var_folders_7s_75jn6mvs2_xfh3v7hmq7v0140000gn_T_main_2edfc3_mi_0);

? ? }

? ? return 0;

}

方法交換

當項目中需要大的修改 或者某個方法有存在問題一般會用到?

項目中如果url不符合規(guī)則就會url =nil,下面為URLWithString 添加一個篩選條件可以更清楚地定位到問題悠瞬,為系統(tǒng)類的方法添加工程我們一般都會使用擴展類们豌。添加NSURL+Url.H

NSURL * url = [NSURL URLWithString:@"中文"];

具體代碼:

#import"NSURL+Url.h"#import@implementationNSURL(Url)//+(instancetype)URLWithString:(NSString *)URLString{//}+(instancetype)YH_URLWithStr:(NSString *)str{

? ? NSURL *url = [NSURL YH_URLWithStr:str];

? ? if (url==nil) {

? ? ? ? NSLog(@"url為Nil");

? ? }

? ? return url;

}

+(void)load{

? ? //交換方法? ? //method 成員方法//? ? class_getClassMethod 獲取類方法//? ? class_getInstanceMethod 獲取靜態(tài)方法? ? Method urlWithUrl = class_getClassMethod(self, @selector(URLWithString:));

? ? Method YH_URLWithStr = class_getClassMethod(self, @selector(YH_URLWithStr:));

? ? method_exchangeImplementations(urlWithUrl, YH_URLWithStr);

}

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涯捻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子望迎,更是在濱河造成了極大的恐慌障癌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辩尊,死亡現(xiàn)場離奇詭異涛浙,居然都是意外死亡,警方通過查閱死者的電腦和手機摄欲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門轿亮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒿涎,你說我怎么就攤上這事哀托。” “怎么了劳秋?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵仓手,是天一觀的道長。 經(jīng)常有香客問我玻淑,道長嗽冒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任补履,我火速辦了婚禮添坊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箫锤。我一直安慰自己贬蛙,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布谚攒。 她就那樣靜靜地躺著阳准,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馏臭。 梳的紋絲不亂的頭發(fā)上野蝇,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音括儒,去河邊找鬼绕沈。 笑死,一個胖子當著我的面吹牛帮寻,可吹牛的內(nèi)容都是我干的乍狐。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼规婆,長吁一口氣:“原來是場噩夢啊……” “哼澜躺!你這毒婦竟也來了蝉稳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤掘鄙,失蹤者是張志新(化名)和其女友劉穎耘戚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體操漠,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡收津,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浊伙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撞秋。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嚣鄙,靈堂內(nèi)的尸體忽然破棺而出吻贿,到底是詐尸還是另有隱情,我是刑警寧澤哑子,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布舅列,位于F島的核電站,受9級特大地震影響卧蜓,放射性物質(zhì)發(fā)生泄漏帐要。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一弥奸、第九天 我趴在偏房一處隱蔽的房頂上張望榨惠。 院中可真熱鬧,春花似錦盛霎、人聲如沸赠橙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽简烤。三九已至,卻和暖如春摇幻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挥萌。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工绰姻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人引瀑。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓狂芋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親憨栽。 傳聞我的和親對象是個殘疾皇子帜矾,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361