1> 建立乙個 person 類,並定義兩個方法 study 和 run,分別實現
#import "person.h"
@implementation
person
- (void)study
- (void)run
@end
2> 正常呼叫方法
int main(int argc, const
char * argv)
執行程式,結果如下:
3> 交換方法實現
int main(int argc, const char * argv)
return
0;}
執行程式,結果如下:
由執行結果可知:study 方法和 run 方法的實現的確被交換了。
4. 交換系統自帶的方法
在實際開發中,交換方法最大的應用場景是`替換系統自帶的方法。
4.1 舉例分析
舉個例子:從ios6到ios7,蘋果的介面風格由 『擬物化』 轉變為 『扁平化』。
『怎麼快速適配?』
1> 設定是通過系統的 imagenamed 方法來實現的。
2> 如果要進行ios7之後版本的適配,首先需要平面設計師做出一套扁平化的,然後對系統版本(systemversion)進行判斷: 大於7.0就是用扁平化。
3> 如果專案中很多地方都有設定的**,就要在每一處都新增判斷系統版本的**,工作量十分龐大,很不現實。這個時候,就可以考慮使用執行時交換方法來解決問題。
『解決思路』
1> 假設舊的名為 『***.png』,可以讓平面設計師將新的名命名為』***_ios7.png』
2> 自定義乙個 『xfq_imagenamed』 方法,在該方法中進行系統版本判斷,如果大於7.0就使用』***_ios7.png』的。
3> 交換自定義的 『xfq_imagenamed』 方法 和 系統的 『imagenamed』 方法的實現
4.2 **實現
1> 自定義 uiimage+extension 分類
uiimage+extension.m
#import
"uiimage+extension.h"
#import
@implementation uiimage (extension)
/** 當某個類或者分類載入到記憶體的時候,會呼叫1次
*/+ (void)load
+ (uiimage *)xfq_imagenamed:(nsstring *)name
// 這裡需要特別注意: return的時候,使用的是自定義的方法,這個時候由於已經交換了方法,實際上呼叫的是系統的imagenamed方法'
return [uiimage xfq_imagenamed:name];
}// 注意: 在分類中重寫系統方法,不能滿足要求
// 這種方式會導致系統原來的方法無法使用
//+ (uiimage *)imagenamed:(nsstring *)name
// // 會死迴圈
// return [self imagenamed:name];
//}@end
2> 控制器中呼叫
#import
"viewcontroller.h"
@inte***ce viewcontroller ()
@property (weak, nonatomic) iboutlet uiimageview *imageview;
@end
@implementation viewcontroller
/** ios6 -> ios7
擬物化 -> 扁平化
*/- (void)viewdidload
@end
RunTime執行時之動態新增方法
import viewcontroller.h import person.h 複製 1 runtime 動態新增方法 oc都是懶載入機制,只要乙個方法實現了,就會馬上新增到方法列表中.qq,微博,直播等等應用,都有會員機制 performselector 去執行某個方法。performselect...
runtime 執行時機制
首先,第乙個問題,1 runtime實現的機制是什麼,怎麼用,一般用於幹嘛?這個問題我就不跟大家繞彎子了,直接告訴大家,runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api。在我們平時編寫的oc 中,程式執行過程時,其實最終都是轉成了runtime的c語言 r...
runtime 執行時機制
必備常識 1.ivar 成員變數 2.method 成員方法相關應用 1.nscoding 歸檔和解檔,利用runtime遍歷模型物件的所有屬性 2.字典 模型 利用runtime遍歷模型物件的所有屬性,根據屬性名從字典中取出對應的值,設定到模型的屬性上 3.kvo 利用runtime動態產生乙個類...