Runtime相關

1. 當接手一個比較大的項目時,利用method Swizzle (方法交換),來快速熟悉項目,從控制臺輸出當前控制器的名稱
  • 創建 UIViewcontroller 的一個分類
  • 引入頭文件 #import <objc/runtime.h>
  • 在load方法中將自定義的logViewWillAppear方法與系統的viewWillAppear 方法進行交換
+ (void)load {
    
    //我們只有在開發的時候才需要查看哪個viewController將出現
    //所以在release模式下就沒必要進行方法的交換
#ifdef DEBUG
    
    //原本的viewWillAppear方法
    Method viewDidAppear = class_getInstanceMethod(self, @selector(viewDidAppear:));
    
    //需要替換成 能夠輸出日志的viewWillAppear
    Method logViewWillAppear = class_getInstanceMethod(self, @selector(logViewWillAppear:));
    
    //兩方法進行交換
    method_exchangeImplementations(viewDidAppear, logViewWillAppear);
    
#endif

}
  • 自定義logViewWillAppear
- (void)logViewWillAppear:(BOOL)animated {
    
    NSString *className = NSStringFromClass([self class]);
    
    //在這里,你可以進行過濾操作,指定哪些viewController需要打印,哪些不需要打印
//    if ([className hasPrefix:@"UI"] == NO) {
//        NSLog(@"%@ will appear",className);
//    }
    NSLog(@"currentControllerName = %@",className);
    //下面方法的調用,其實是調用viewWillAppear
    [self logViewWillAppear:animated];
}
  • 將分類文件直接拖入項目即可使用
2. 利用關聯對象為分類添加屬性
  • 分類中添加屬性
@interface Person (name)
@property(nonatomic,strong)NSString *name;
@end
  • 利用關聯對象進行綁定
-(NSString *)name{
    return objc_getAssociatedObject(self, @"name");
    
}
-(void)setName:(NSString *)name{
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,933評論 18 139
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,774評論 0 9
  • 導語 在經歷了用NSLog來記錄日志的寫法后,我意識到一個問題,如果當你在項目里想要用NSLog輸出一個當時你想要...
    掉了西紅柿皮_Kee閱讀 423評論 0 2
  • 修改系統方法 動態添加方法 動態給系統類添加屬性(給分類添加屬性) runtime+kvc 轉換模型
    Vijay_閱讀 124評論 0 0
  • 本篇涵蓋runtime的解析、應用等. 1.runtime快速入門和實戰2.Runtime 10種用法(沒有比這更...
    守護地中海的花閱讀 178評論 0 0