runtime

runtime.png

1.將某些OC代碼轉為運行時代碼,探究底層,比如block的實現原理;
2.攔截系統自帶的方法調用(Swizzle 黑魔法),也可以說成對系統的方法進行替換,比如攔截imageNamed:、viewDidLoad、alloc;

a、為UIImage建一個分類(UIImage+Category)

b、在分類中實現一個自定義方法,方法中寫要在系統方法中加入的語句,比如版本判斷[參考 ]

+ (UIImage*)xh_imageNamed:(NSString*)name {
 
doubleversion = [[UIDevicecurrentDevice].systemVersiondoubleValue];
 
if(version >=7.0) {
 
// 如果系統版本是7.0以上,使用另外一套文件名結尾是‘_os7’的扁平化圖片
 
name = [name stringByAppendingString:@"_os7"];    }
 
return[UIImagexh_imageNamed:name];
 
}

分類中重寫UIImage的load方法,實現方法的交換(只要能讓其執行一次方法交換語句,load再合適不過了)

+ (void)load {
 
// 獲取兩個類的類方法
 
Method  m1 = class_getClassMethod([UIImageclass],@selector(imageNamed:));  
 
Method m2 = class_getClassMethod([UIImageclass],@selector(xh_imageNamed:));
 
// 開始交換方法實現
 
method_exchangeImplementations(m1, m2);
 
}

3.實現分類也可以增加屬性;

4.實現NSCoding的自動歸檔和自動解檔;(不用對每個屬性edcode和decode了,如果幾十個屬性一個個的encode和decode真的很麻煩啊,使用運行時可以遍歷出每個對象的屬性,數組的方式遍歷eccode,decode);

- (void)encodeWithCoder:(NSCoder *)encoder{
unsigned int count = 0;
Ivar * ivars = class_copyIvarList([Movie class],&count);
for (int i = 0; i < count; i++){
  // 取出i位置對應的成員變量
  Ivar ivar = ivars[i];
  // 查看成員變量
   const char * name = ivar_getName(ivar);
   NSString * key = [NSString stringWithUTF8String:name];
   id value = [self valueForKey:key];
   [encoder encodeObject:value forKey:key];
 }
 free(ivars);
}

- (id)initWithCoder:(NSCoder *)decoder{
if (self = [super init]) {
unsigned int count = 0;
Ivar *  ivars = class_copyIvarList([Movie class],&count);
for (int i = 0; i < count; i++){
  // 取出i位置對應的成員變量
  Ivar ivar = ivars[i];
  // 查看成員變量
   const char * name = ivar_getName(ivar);
   NSString * key = [NSString stringWithUTF8String:name];
id value = [decoder decodeObjectForKey:key];
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
}

5.實現字典和模型的自動轉換(核心就是可以遍歷出字典中的每個屬性,json解析中大牛框架都用了這個特性,包括MJEXtension,YYModel,jsonModel都是將json轉換為字典,再遍歷字典中的每個屬性來進行modle的轉換)。

6 動態增加方法 動態的為某個類或對象增加一個方法

7 動態變量控制 動態對某個對象的變量的值進行替換

8 實現萬能控制器跳轉
產品來一變態需求,推送過來的消息,要跳轉到任意控制器.利用runtime動態生成對象、屬性、方法這特性,我們可以先跟服務端商量好,定義跳轉規則,比如要跳轉到A控制器,需要傳屬性id、type,那么服務端返回字典給我,里面有控制器名,兩個屬性名跟屬性值,客戶端就可以根據控制器名生成對象,再用kvc給對象賦值,這樣就搞定了;
9 插件開發
插件入門
XCode 有個很坑爹的地方,就是它并不官方支持插件開發,官方沒有文檔,XCode 也沒有開源,但由于 XCode 是 Objective-C 寫的,OC 動態性太強大,導致在這么封閉的情況下民間還是可以做出各種插件,其核心開發方式就是:
dump 出 Xcode 所有頭文件,知道 Xcode 里有哪些類和接口。
通過頭文件方法名猜測方法的作用,swizzle 這些方法,插入自己的代碼實現插件邏輯。
通過 NSNotificationCenter 監聽各種事件的發生。

10 Jspath 也是使用運行時,jspatch 基本上算是黑科技,在線修復版本bug,微信都使用了這個技術.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容