在終端進入main.m的同一級目錄共屈,使用clang -rewrite main.m編譯出main.cpp文件
我們可以看到main函數(shù)被編譯成如下圖的函數(shù):
在消息機制里沒有類方法和對象方法這種說辭闸英,都是給對象發(fā)送消息。
runtime在程序運行的時候曾雕,對某個類動態(tài)的添加,修改屬性和方法。
Runtime運行時是在iOS代碼運行時將其翻譯成對應(yīng)的C語言程序。?
Runtime 運行時是蘋果提供的一個API癌淮,屬于一個C語言的庫。那么在iOS開發(fā)中沦补,Runtime運行時有什么用呢乳蓄??
? ?1. 利用Runtime運行時,在程序的運行過程中夕膀,動態(tài)創(chuàng)建一個類虚倒。?
? ?2. 利用Runtime運行時,在程序的運行過程中产舞,動態(tài)修改一個類的屬性/方法魂奥。?
? ?3. 利用Runtime運行時,遍歷一個類的所有的屬性和方法易猫。?
用的時候需要導(dǎo)入頭文件: objc/runtime.h或objc/message.h(包含了objc/runtime.h)
下面就介紹一下用Runtime運行時來實現(xiàn)KVO的一個過程耻煤,基本步驟如下:
? ?1.動態(tài)添加被監(jiān)聽對象類的一個子類;
? ?2.在該子類中動態(tài)添加被監(jiān)聽的屬性的set方法准颓,即重寫父類的屬性的set方法哈蝇;
? ?3.當調(diào)用被監(jiān)聽的屬性的set方法且改屬性的值發(fā)生改變的時候通知外界。
特別注意:?
一個類的屬性賦值形式為object.property = …?
一個類的成員變量賦值形式為object->MemberVariable = …?
KVO不能觀察到成員變量的值的變化攘已,因為KVO是動態(tài)添加了一個被監(jiān)聽對象類的子類炮赦,然后重寫了被監(jiān)聽對象類的屬性的set方法,在該方法中來做的通知贯被,所以只有調(diào)用set方法才能被檢測到
使用RunTime實現(xiàn)KVO機制眼五,下面直接上代碼:
下面是NSObject+SYKVO的使用:
使用RunTime交換方法:
在ViewController.m中我們使用代碼:NSURL *url = [NSURL URLWithString:@"www.baidu.com"];
? ? NSLog(@"%@", url);