iOS runtime實用篇:讓你快速上手一個項目

前言:編程

  • 對於一個大項目而言,最煩惱的就是在衆多界面難以找到對應的viewController,要改個東西都要花好長的時間去找對應的類。架構

  • 特別是當你接手一個大項目的時候,對總體的業務邏輯不熟悉,總體的架構體系不熟悉,讓你修復某個頁面的BUG,估計你找這個頁面所對應的viewController都要找很久。app

思考

  • 可否有一種方式能夠快速讓你上手一個大項目?快速找到某個頁面所對應的viewController ?spa

思路

  • 在每個頁面出現的時候,都打印出哪一個類即將出現,以下圖所示日誌

1594675-6d84eb99316876a7.png

 

解決方案

  • 方案1code

    • 整個項目中創建一個基類的viewController,而後將項目中全部的viewController都繼承於基類的viewController,而後重寫基類中的viewWillAppear方法blog

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSString *className = NSStringFromClass([self class]);
    NSLog(@"%@ will appear", className);
}
  • 方案2繼承

    • 給UIViewContoller創建一個分類,在分類裏進行方法的交換,既保留了本來的方法,又有打印信息開發

//
//  UIViewController+Swizzling.m
//  CollectionsOfExample
//
//  Created by mac on 16/10/1.
//  Copyright ? 2016年 chenfanfang. All rights reserved.
//

#import "UIViewController+Swizzling.h"

#import @implementation UIViewController (Swizzling)

+ (void)load {

    //咱們只有在開發的時候才須要查看哪一個viewController將出現
    //因此在release模式下就不必進行方法的交換
#ifdef DEBUG

    //本來的viewWillAppear方法
    Method viewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:));

    //須要替換成 可以輸出日誌的viewWillAppear
    Method logViewWillAppear = class_getInstanceMethod(self, @selector(logViewWillAppear:));

    //兩方法進行交換
    method_exchangeImplementations(viewWillAppear, logViewWillAppear);

#endif

}

- (void)logViewWillAppear:(BOOL)animated {

    NSString *className = NSStringFromClass([self class]);

    //在這裏,你能夠進行過濾操做,指定哪些viewController須要打印,哪些不須要打印
    if ([className hasPrefix:@"UI"] == NO) {
        NSLog(@"%@ will appear",className);
    }


    //下面方法的調用,實際上是調用viewWillAppear
    [self logViewWillAppear:animated];
}

@end

優缺點分析

  • 方案1  適用於一個新項目,從零開始搭建的項目,創建一個基類controller,這種編程思想很是可取。但對於一個已經成型的項目,則方案一行不通,你總不能建議一個基類,讓後將全部的controller繼承的類都改爲基類吧?這工程量太大,太麻煩。get

  • 方案2 不管是從零開始搭建的項目,仍是已經成型的項目,方案2都適用。

 

 

原文:http://www.jianshu.com/p/78efcc9575b7

相關文章
相關標籤/搜索