runtime運行時應用場景-method swizzling

實際開發(fā)中可能面臨這樣的需求:

  • 需要把所有的UILabel的字體放大2號
  • 需要給所有ViewController添加友盟統(tǒng)計

簡單粗暴地方法就是UILabel和ViewController挨個改畦韭,但是作為一個程序員龄减,這樣改就太丟人了泞辐。就算不考慮自己的面子阻肿,也總得為公司的發(fā)展大計著想吧。

如果是項目開始,可以考慮建個BaseViewController轿亮,或者用Category也能實現⌒厍剑可是如果是項目已經有了一定規(guī)模之后我注,再提出以上需求,就需要用到更深層次的技術(runtime)了迟隅。

先是UILabel字體大小的問題但骨,新建一個UILabel的category

#import <UIKit/UIKit.h>  
@interface UILabel (WFFontLabel)  
@end 

具體實現

    #import "UILabel+WFFontLabel.h"  
    #import <objc/runtime.h>  
      
    @implementation UILabel (WFFontLabel)  
      
    + (void)load {  
        static dispatch_once_t onceToken;  
        dispatch_once(&onceToken, ^{  
            Class class = [self class];  
      
            // 獲取兩個方法的IMP(指針)  
            Method originalMethod2 = class_getInstanceMethod(class, @selector(setFont:));  
            Method swizzledMethod2 = class_getInstanceMethod(class, @selector(WFSetFont:));  
      
            // 交換IMP  
            method_exchangeImplementations(originalMethod2, swizzledMethod2);  
      
        });  
    }  
      
    - (void)WFSetFont:(UIFont *)font {  
        UIFont * newFont = [UIFont systemFontOfSize:font.pointSize+10];  
        [self WFSetFont:newFont];  
    }  
      
    @end  

當然,如果想更嚴謹一些智袭,可以寫成下面這樣(個人認為沒有必要)

static dispatch_once_t onceToken;  
   dispatch_once(&onceToken, ^{  
       Class class = [self class];  
  
       Method originalMethod2 = class_getInstanceMethod(class, @selector(setFont:));  
       Method swizzledMethod2 = class_getInstanceMethod(class, @selector(WFSetFont:));  
  
       BOOL didAddMethod2 = class_addMethod(class, @selector(setFont:), method_getImplementation(swizzledMethod2), method_getTypeEncoding(swizzledMethod2));  
  
       if (didAddMethod2) {  
           class_replaceMethod(class,  
                               @selector(WFSetFont:),  
                               method_getImplementation(originalMethod2),  
                               method_getTypeEncoding(originalMethod2));  
       }else {  
           method_exchangeImplementations(originalMethod2, swizzledMethod2);  
       }  
  
   });

另外一個給所有ViewController添加友盟統(tǒng)計嗽冒,類似的,新建一個viewcontroller的category

    #import <UIKit/UIKit.h>  
    @interface UIViewController (WFAnalysis)  
    @end  

具體實現

    #import "UIViewController+WFAnalysis.h"  
    #import <objc/message.h>  
    
    @implementation UIViewController (WFAnalysis)  
      
    + (void)load {  
        [super load];  
        Method orgMethod = class_getInstanceMethod([self class], @selector(viewWillAppear:));  
        Method swizzledMethod = class_getInstanceMethod([self class], @selector(customViewWillAppear:));  
      
        method_exchangeImplementations(orgMethod, swizzledMethod);  
    }  
      
    - (void)customViewWillAppear:(BOOL)animated {  
        [self customViewWillAppear:animated];  
        NSLog(@"可以在這里添加統(tǒng)計代碼");  
    }  
      
    @end  

原文地址:http://blog.csdn.net/zwf_apple/article/details/53127706

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末补履,一起剝皮案震驚了整個濱河市添坊,隨后出現的幾起案子,更是在濱河造成了極大的恐慌箫锤,老刑警劉巖贬蛙,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異谚攒,居然都是意外死亡阳准,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門馏臭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來野蝇,“玉大人,你說我怎么就攤上這事括儒∪粕颍” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵帮寻,是天一觀的道長乍狐。 經常有香客問我,道長固逗,這世上最難降的妖魔是什么浅蚪? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮烫罩,結果婚禮上惜傲,老公的妹妹穿的比我還像新娘。我一直安慰自己贝攒,他們只是感情好盗誊,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般浊伙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上长捧,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天嚣鄙,我揣著相機與錄音,去河邊找鬼串结。 笑死哑子,一個胖子當著我的面吹牛,可吹牛的內容都是我干的肌割。 我是一名探鬼主播卧蜓,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼把敞!你這毒婦竟也來了弥奸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤奋早,失蹤者是張志新(化名)和其女友劉穎盛霎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體耽装,經...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡愤炸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了掉奄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片规个。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姓建,靈堂內的尸體忽然破棺而出诞仓,到底是詐尸還是另有隱情,我是刑警寧澤速兔,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布狂芋,位于F島的核電站,受9級特大地震影響憨栽,放射性物質發(fā)生泄漏帜矾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一屑柔、第九天 我趴在偏房一處隱蔽的房頂上張望屡萤。 院中可真熱鬧,春花似錦掸宛、人聲如沸死陆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽措译。三九已至别凤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間领虹,已是汗流浹背规哪。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塌衰,地道東北人诉稍。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像最疆,于是被迫代替她去往敵國和親杯巨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內容

  • 發(fā)現 關注 消息 iOS 第三方庫努酸、插件服爷、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,131評論 4 61
  • 何為閨蜜,要好获诈,親密层扶,無話不談。人的一生中總有那么一個或幾個好閨蜜/好基友烙荷。哪怕她歷經鉛華镜会、子孫滿堂,都不會妨礙...
    有個二貨居然閱讀 278評論 0 1
  • 【導讀】不做好準備,就是準備失敗昼伴。頂級銷售冠軍拜訪客戶前都會做哪些準備呢匾旭?看看你和他們的差距在哪里。怡歷得為你揭秘...
    蝸牛戀峰閱讀 695評論 0 0
  • 2015年3月17日圃郊,我入職實習了价涝,雖然不是學生時代的第一次實習,但我知道這是學生時代的最后一次實習持舆。公司里...
    CoolEgos閱讀 204評論 0 1
  • 題目描述: 對于每一個正整數奇數n色瘩,輸出一個n X n矩陣(奇數階魔陣), 矩陣元素由1~n平方整數組成, 矩陣的...
    板混DK閱讀 1,200評論 0 2