亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOSRunTime的簡單使用

2019-11-14 18:10:13
字體:
來源:轉載
供稿:網友

1.根據指定規則根據runtime進行頁面選擇跳轉

        背景:要根據后臺返回的數據 進行選擇要跳轉到哪一個ViewController  

    

 // 這個規則肯定事先跟服務端溝通好,跳轉對應的界面需要對應的參數

    NSDictionary *userInfo = @{

                               @"class": @"HSFeedsViewController",

                               @": @{//類中所需要的參數

                                       @"ID": @"123",

                                       @"type": @"12"

                                       }

                               };

        思路:使用runtime去解決這個問題的思路就是 通過運行時 根據對應的類名去創建類以及類的屬性,這就需要和服務端去協商返回的數據形式 要類似: 

        實現:  這里使用了三個objc/runtime.h中函數分別是: 

 

(1)objc_getClass(const char *name)  即返回對應的類;

(2)objc_allocateClassPair(Class superClass,const char*name ,size_t extraBytes) 為對應的類設置父類,并根據父類和extraBytes(變量的字節數) 給這個類分配空間

(3)objc_registerClassPair(class) 注冊這個類

         通過這三個函數 創建類一個類

 

還有一個運行時函數  class_copyPropertyList(Class class,unsigned int *outCount) 

 

objc_property_t  class_copyPropertyList(Class class,unsigned int *outCount)    返回值為一個數組 數組中為對應的類的屬性列表 以此來對比類中是否含有當前屬性,從而通過KVC為類的屬性賦值.

 

2.修改系統類的方法實現

      背景:如果需求中要統計每個viewController 展示給用戶的次數,我們想到的就是在ViewController中添加對應的統計的代碼,但是會很麻煩,此時可以創建一個UI ViewController的分類更改底層中viewWillAppear的實現 這就用到runtime中method Swizzling (方法混合)

     實現:通過methodSwizzling 修改了UIViewController的@selector(viewWillAppear:)對應的函數指針,使他的實現指向了自定的方法

 

#import "UIViewController+Tracking.h"#import <objc/runtime.h> @implementation UIViewController (Tracking) + (void)load{        static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        Class  class  = [self class];        SEL originalSelector = @selector(viewWillAppear:);        SEL swizzlingSelector = @selector(swizzling__viewWillAppear:);        Method originMethod = class_getInstanceMethod(class, originalSelector);        Method swizzlingMethod = class_getInstanceMethod(class, swizzlingSelector);                //將 swizzlingMethod 中的實現過程添加到 originalSelector 這個方法中        BOOL didAddMethod = class_addMethod(class,originalSelector, method_getImplementation(swizzlingMethod), method_getTypeEncoding(swizzlingMethod));        if (didAddMethod) {            //用 originMethod中的實現 替換 swizzlingSelector這個方法中的實現 這樣原始的和自定義的方法都執行的時同一個實現過程            class_replaceMethod(class, swizzlingSelector, method_getImplementation(originMethod), method_getTypeEncoding(originMethod));        }else{//可能出現添加失敗的情況(比如 被添加的方法中已經存在了對應方法的實現 就會返回NO)            //將 originMethod 和 swizzlingMethod中的實現過程進行交換            method_exchangeImplementations(originMethod, swizzlingMethod);        }            });}/* 經過上面的  class_method 和 class_replaceMethod 或  method_exchangeImplementations 就實現了 //http://blog.jobbole.com/79580/ */ - (void)swizzling__viewWillAppear:(BOOL)animation{    [self swizzling__viewWillAppear:animation];    NSLog(@"swizzling_viewWillAppear");}

 

(1)通過兩個方法  class_addMethod class_replaceMethod這個方法實現方法Method這個結構體中 IMP對應的函數指針對應的函數實現進行添加 或者 替換SEL 代表了Method的名稱name,IMP代表函數指針 即為函數在內存中的開始位置

另外還有一些注意事項 為什么一定要寫在load中 還要寫在dispatch_once中,因為swilzzing method會影響代碼的整體狀態 甚至有可能改變程序的運行流程,要保證避免并發的競爭,而+load方法是在類初始化就進行了加載(這里不太明白具體原理)詳細參看下面鏈接

http://nshipster.com/method-swizzling/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久综合久久美利坚合众国| 国产福利精品在线| 国产一区二区丝袜| 一本一道久久a久久精品逆3p| 91精品国产高清久久久久久| 国产精品白嫩美女在线观看| 久久国产天堂福利天堂| 亚洲国产精品999| 色噜噜亚洲精品中文字幕| 欧美成人精品h版在线观看| 欧美日韩美女在线观看| 国产手机视频精品| 久久亚洲成人精品| 亚洲热线99精品视频| 成人性生交大片免费观看嘿嘿视频| 精品无人国产偷自产在线| 久久久久久久久久国产| 亚洲一区二区在线播放| 久久九九亚洲综合| 亚洲欧美另类国产| 国产精品国产亚洲伊人久久| 一区二区三区国产视频| 欧美另类99xxxxx| 日韩欧美在线视频免费观看| 成人疯狂猛交xxx| 亚洲色图50p| 91免费精品国偷自产在线| 亚洲第一精品久久忘忧草社区| 亚洲欧美一区二区三区情侣bbw| 亚洲美女www午夜| 亚洲二区在线播放视频| 成人性生交大片免费看小说| 亚洲国产精品电影| 欧美日韩aaaa| 中文字幕亚洲欧美一区二区三区| 国产精品极品美女粉嫩高清在线| 国产精品扒开腿爽爽爽视频| 欧美激情久久久久| 超碰日本道色综合久久综合| 亚洲激情视频在线观看| 国产+人+亚洲| 亚洲精品99久久久久中文字幕| 国产日韩欧美在线视频观看| 国内精品美女av在线播放| 日韩成人在线视频观看| 亚洲欧洲美洲在线综合| 欧美极品美女视频网站在线观看免费| 亚洲欧美在线播放| 97视频在线看| www.亚洲免费视频| 国产亚洲福利一区| 亚洲人成网站999久久久综合| 日韩精品在线观看一区二区| 亚洲色在线视频| 成人动漫网站在线观看| 国产精品成人av性教育| 91免费的视频在线播放| 欧美人在线视频| 欧美日韩另类在线| 欧美一级bbbbb性bbbb喷潮片| 日韩三级成人av网| 国产日韩欧美成人| 欧美激情高清视频| 成人性教育视频在线观看| 国产成人精品在线观看| 成人做爰www免费看视频网站| 日韩美女福利视频| 日韩成人在线免费观看| 7m第一福利500精品视频| 亚洲欧美国产视频| 2019日本中文字幕| 久久精品国产免费观看| 成人午夜激情网| 91精品久久久久久久久久久久久| 亚洲国产欧美一区二区三区久久| 色综合老司机第九色激情| 亚洲毛片一区二区| 色妞色视频一区二区三区四区| 成人444kkkk在线观看| 欧美大秀在线观看| 日韩风俗一区 二区| 国产成人精品免高潮在线观看| 国产精品久久一区| 国产精品永久在线| 羞羞色国产精品| 久久99国产精品自在自在app| 亚洲欧美日韩久久久久久| 视频在线观看一区二区| 亚洲精品国产精品自产a区红杏吧| 欧美极品少妇xxxxⅹ免费视频| 国产日韩在线免费| 亚洲成人激情图| 国产精品久久久久久中文字| 亚洲人高潮女人毛茸茸| 亚洲国产日韩精品在线| 久久6免费高清热精品| 久久在线免费视频| 26uuu亚洲国产精品| 欧美成人免费全部| 91麻豆国产语对白在线观看| 69av在线播放| 国产精品一区专区欧美日韩| 欧美性jizz18性欧美| 欧美激情第6页| 国产精品久久久久久久久久东京| 日本欧美中文字幕| 深夜福利一区二区| 亚洲精品白浆高清久久久久久| 性日韩欧美在线视频| 国产一区二区三区在线播放免费观看| 国产成人aa精品一区在线播放| 亚洲v日韩v综合v精品v| 久久久精品999| 中文字幕日韩专区| 国产亚洲精品久久久久久牛牛| 久久免费视频这里只有精品| 91成人在线观看国产| 一区二区三区动漫| 中文字幕av日韩| 国内精品视频在线| 亚洲色图av在线| 国产精自产拍久久久久久蜜| 日本高清不卡的在线| 国产成人福利网站| 色偷偷亚洲男人天堂| 日韩性生活视频| 国产精品欧美激情在线播放| 热久久这里只有| 欧美视频国产精品| 国内自拍欧美激情| 日韩视频欧美视频| 亚洲欧洲激情在线| 日韩av影院在线观看| 91国产精品视频在线| 一区二区三区视频观看| 亚洲国产美女精品久久久久∴| 亚洲一区二区三区成人在线视频精品| 国产成人高清激情视频在线观看| 欧美福利视频在线| 久久精品久久久久久国产 免费| 亚洲精品自产拍| 日韩精品极品毛片系列视频| 中文字幕av一区中文字幕天堂| www国产亚洲精品久久网站| 最近2019好看的中文字幕免费| 亚洲性69xxxbbb| 在线午夜精品自拍| 国产精品99久久久久久久久久久久| 深夜精品寂寞黄网站在线观看| 日韩男女性生活视频| 欧洲精品在线视频| 成人精品网站在线观看| 欧美激情国产精品| 亚洲自拍小视频| 欧美大胆在线视频| 国产精品久久久久影院日本| 欧美精品手机在线| 伊人久久久久久久久久久久久| 中文字幕视频一区二区在线有码| 91久久国产精品| 久久精品久久精品亚洲人| 最近免费中文字幕视频2019| 久久久久久久久久久成人| 国产精品www网站|