1. 程式人生 > >iOS runtime實用篇 - 方法交換

iOS runtime實用篇 - 方法交換

通常對於一個新接手的專案,我們會想知道哪頁對應的是哪個VC,如果想實現點到頁面就列印對應的類,會有以下兩個方法。


方案1

  • 適用新專案 (基類)
    整個專案中建立一個基類的viewController,然後將專案中所有的viewController都繼承於基類的viewController,然後重寫基類中的viewWillAppear方法
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSString *className = NSStringFromClass([self
class]); NSLog(@"%@ will appear", className); }

方案2

  • 不論是從零開始搭建的專案,還是已經成型的專案,都適用。(runtime方法交換)
//
//  UIViewController+Swizzling.m
//  RunTimeDemo
//
//  Created by LXChen on 2017/5/17.
//  Copyright © 2017年 LXChen. 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