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

首頁 > 系統 > iOS > 正文

總結iOS中runtime的使用

2020-07-26 03:17:48
字體:
來源:轉載
供稿:網友

做iOS的朋友都知道或聽說runtime,這個東西很像java的反射機制,但功能遠勝于java的反射。通過runtime我們可以動態的向一個類中添加屬性、成員變量、方法,以及對其進行讀寫訪問。

一、runtime簡介

RunTime簡稱運行時。OC就是運行時機制,也就是在運行時候 的一些機制,其中最主要的是消息機制。

對于C語言,函數的調用在編譯的時候會決定調用哪個函數。

對于OC的函數,屬于動態調用過程,在編譯的時候并不能決定真正調用哪個函數,只有在真正運行的時候才會根據函數的名稱

找到對應的函數來調用。

事實證明:

    在編譯階段,OC可以調用任何函數,即使這個函數并未實現,只要聲明過就不會報錯。

    在編譯階段,C語言調用未實現的函數就會報錯。

二、runtime作用

1.發送消息

方法調用的本質,就是讓對象發送消息。

objc_msgSend,只有對象才能發送消息,因此以objc開頭.

使用消息機制前提,必須導入#import <objc/message.h>

消息機制簡單使用

消息機制原理:對象根據方法編號SEL去映射表查找對應的方法實現

   // 創建person對象  Person *p = [[Person alloc] init];  // 調用對象方法  [p eat];  // SEL:方法編號,根據方法編號就可以找到對應方法實現  [p performSelector:@selector(eat)];  // 本質:讓對象發送消息  objc_msgSend(p, @selector(eat));  // 調用類方法的方式:兩種  // 第一種通過類名調用本質類名轉換成類對象  [Person eat];  // 第二種通過類對象調用  [[Person class] eat];  [personClass performSelector:@selector(eat)];  // 用類名調用類方法,底層會自動把類名轉換成類對象調用  // 本質:讓類對象發送消息  objc_msgSend([Person class], @selector(eat));

2.交換方法

開發使用場景:系統自帶的方法功能不夠,給系統自帶的方法擴展一些功能,并且保持原有的功能。

方式一:繼承系統的類,重寫方法.

方式二:使用runtime,交換方法.

@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  // Do any additional setup after loading the view, typically from a nib.  // 需求:給imageNamed方法提供功能,每次加載圖片就判斷下圖片是否加載成功。  // 步驟一:先搞個分類,定義一個能加載圖片并且能打印的方法+ (UIImage *)xmg_imageNamed:(NSString *)imageName;  // 步驟二:交換imageNamed和xmg_imageNamed的實現,就能調用xmg_imageNamed,間接調用xmg_imageNamed的實現。  UIImage *image = [UIImage imageNamed:@"123"];     imageNamed:   實現方法:底層調用PH_imageNamed   本質:交換兩個方法的實現imageNamed和PH_imageNamed方法   調用imageNamed其實就是調用PH_imageNamed   imageNamed加載圖片,并不知道圖片是否加載成功   以后調用imageNamed的時候,就知道圖片是否加載}@end@implementation UIImage (Image)// 加載分類到內存的時候調用+ (void)load{  // 交換方法實現,方法都是定義在類里面  // class_getMethodImplementation:獲取方法實現  // class_getInstanceMethod:獲取對象  // class_getClassMethod:獲取類方法  // IMP:方法實現  // imageNamed  // Class:獲取哪個類方法  // SEL:獲取方法編號,根據SEL就能去對應的類找方法  Method imageNameMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));  Method PH_imageNameMethod = class_getClassMethod([UIImage class], @selector(PH_imageNamed:));  // 交換方法實現  method_exchangeImplementations(imageNameMethod, PH_imageNameMethod);} }// 不能在分類中重寫系統方法imageNamed,因為會把系統的功能給覆蓋掉,而且分類中不能調用super.// 既能加載圖片又能打印+ (UIImage *)PH_imageNamed:(NSString *)imageName{  // 加載圖片  UIImage *image = [UIImage PH_imageNamed:imageName];  // 2.判斷功能  if (image == nil) {    NSLog(@"加載為空");  }  return image;}@end

3.動態添加方法

開發使用場景:如果一個類方法非常多,加載類到內存的時候也比較耗費資源,需要給每個方法生成映射表,可以使用動態給某個類,添加方法解決。

簡單使用

@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  // Do any additional setup after loading the view, typically from a nib.  Person *p = [[Person alloc] init];  // 默認person,沒有實現eat方法,可以通過performSelector調用,但是會報錯。  // 動態添加方法就不會報錯  [p performSelector:@selector(eat)];}@end@implementation Person// void(*)()// 默認方法都有兩個隱式參數,默認一個方法都有兩個參數,self,_cmd,隱式參數 self:方法調用者 _cmd:調用方法的編號void eat(id self,SEL sel){  NSLog(@"%@ %@",self,NSStringFromSelector(sel));}// 當一個對象調用未實現的方法,會調用這個方法處理,并且會把對應的方法列表傳過來.// 剛好可以用來判斷,未實現的方法是不是我們想要動態添加的方法<!--動態添加方法,首先實現這個resolveInstanceMethod--><!-- resolveInstanceMethod調用:當調用了沒有實現的方法沒有實現就會調用resolveInstanceMethod--><!-- resolveInstanceMethod作用:就知道哪些方法沒有實現,從而動態添加方法--><!-- sel:沒有實現方法-->+ (BOOL)resolveInstanceMethod:(SEL)sel{  if (sel == @selector(eat)) {    // 動態添加eat方法    // 第一個參數:給哪個類添加方法    // 第二個參數:添加方法的方法編號    // 第三個參數:添加方法的函數實現(函數地址)    // 第四個參數:函數的類型,(返回值+參數類型) v:void @:對象->self :表示SEL->_cmd    class_addMethod(self, @selector(eat), eat, "v@:");  }  return [super resolveInstanceMethod:sel];}@end

4.給分類添加屬性

原理:給一個類聲明屬性,其實本質就是給這個類添加關聯,并不是直接把這個值的內存空間添加到類存空間。

@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  // Do any additional setup after loading the view, typically from a nib.  // 給系統NSObject類動態添加屬性name  NSObject *objc = [[NSObject alloc] init];  objc.name = @"abc";  NSLog(@"%@",objc.name);}@end// 定義關聯的keystatic const char *key = "name";- (void)setName:(NSString *)name{  // 添加屬性,跟對象  // 給某個對象產生關聯,添加屬性  // object:給哪個對象添加屬性  // key:屬性名,根據key去獲取關聯的對象 ,void * == id  // value:關聯的值  // policy:策略  objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSString *)name{  return objc_getAssociatedObject(self, @"name");}

以上就是iOS中runtime的使用總結,本篇文章主要是原理和用法總結,runtime的功能很強大,還需要朋友們多多學習和研究才可以。希望本文對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情在线播放| 欧美性做爰毛片| 色婷婷亚洲mv天堂mv在影片| 国产精品白丝av嫩草影院| 欧美丝袜第一区| 亚洲直播在线一区| 亚洲人成电影网站色…| 欧美多人乱p欧美4p久久| 欧美风情在线观看| 亚洲精选在线观看| 日韩av成人在线| 久久久久国色av免费观看性色| 日韩视频免费在线观看| 国内精品久久久久影院 日本资源| 国产精品久久久久77777| 成人精品久久av网站| 91久久国产婷婷一区二区| 一区二区三区 在线观看视| 久久久久久欧美| 欧美性xxxxhd| 日韩精品视频在线观看网址| 欧美黑人性视频| 91精品国产高清自在线| 丝袜情趣国产精品| 在线观看日韩www视频免费| 少妇精69xxtheporn| 国产精品欧美日韩久久| 2019日本中文字幕| 国产精品444| 97精品国产91久久久久久| 色综合色综合网色综合| 日韩视频免费在线观看| 国产精品日日做人人爱| 一区二区三区视频免费在线观看| 97视频在线观看视频免费视频| 不卡在线观看电视剧完整版| 国产精品美女久久久久av超清| 韩剧1988在线观看免费完整版| 欧美日韩国产一区二区| 久久中文字幕在线视频| 国产成人精品午夜| 一色桃子一区二区| 亚洲精品白浆高清久久久久久| 91久久嫩草影院一区二区| 亚洲国内精品视频| 精品偷拍一区二区三区在线看| 日韩亚洲综合在线| 成人亲热视频网站| 91国自产精品中文字幕亚洲| 中文欧美日本在线资源| 久久成人精品一区二区三区| 国产精品久久久久久亚洲影视| 91免费人成网站在线观看18| 欧美日韩国产二区| 欧美性69xxxx肥| 欧美激情免费视频| 国产网站欧美日韩免费精品在线观看| 韩国19禁主播vip福利视频| 久久精品99无色码中文字幕| 国产一区二区三区视频免费| 日本精品久久久久久久| 日韩精品久久久久久久玫瑰园| 精品国偷自产在线视频99| 日韩va亚洲va欧洲va国产| 久久成人这里只有精品| 91免费观看网站| 日韩精品亚洲精品| 亚洲成人三级在线| 亚洲综合在线播放| 国产精品88a∨| 欧美中文字幕在线| 亚洲天堂av女优| 成人网中文字幕| 97精品伊人久久久大香线蕉| 亚洲午夜av久久乱码| 国产精品久久久久久网站| 国产精品一区二区女厕厕| 亚洲成年人影院在线| 久久手机免费视频| 欧美国产精品人人做人人爱| 伊人伊成久久人综合网站| 亚洲欧美日韩精品久久奇米色影视| 亚洲免费一在线| 中文字幕欧美精品日韩中文字幕| 欧美日韩在线视频一区| 欧美日韩国产精品一区二区不卡中文| 亚洲精品国产精品乱码不99按摩| 国产欧美日韩综合精品| 亚洲第一av网| 中文字幕久精品免费视频| 亚洲高清久久久久久| 97香蕉久久超级碰碰高清版| 欧美—级a级欧美特级ar全黄| 欧美午夜精品久久久久久人妖| 国产香蕉精品视频一区二区三区| 98午夜经典影视| 欧美电影免费观看高清完整| 欧美日韩中文字幕日韩欧美| 亚洲精品网址在线观看| 午夜美女久久久久爽久久| 欧美国产日韩免费| 国产精品免费一区豆花| 国产精品久久久亚洲| 久久69精品久久久久久国产越南| 深夜福利亚洲导航| 欧美精品在线免费观看| 久久韩国免费视频| 亚洲精品ady| 久久97久久97精品免视看| 国外视频精品毛片| 成人乱人伦精品视频在线观看| 在线观看91久久久久久| 亚洲国产精品嫩草影院久久| 国产手机视频精品| 国产精品久久久久久久久粉嫩av| 日韩美女毛茸茸| 国产精品成人国产乱一区| 亚洲男人天堂2023| 久久久国产精品一区| 国产第一区电影| 欧美日韩精品中文字幕| 日韩欧美精品在线观看| 国产精品久久久久99| 日韩欧美综合在线视频| 欧洲精品在线视频| 国产精品久久久久久一区二区| 青青草99啪国产免费| 大伊人狠狠躁夜夜躁av一区| 26uuu另类亚洲欧美日本一| 欧美日本国产在线| 亚洲国产精品人久久电影| 国产成人精品在线观看| www.日韩免费| 亚洲影院色在线观看免费| 欧美性猛交xxxxx水多| 26uuu亚洲国产精品| 亚洲色在线视频| 亚洲精品成a人在线观看| 日韩在线欧美在线国产在线| 九九综合九九综合| 欧美激情一区二区三区高清视频| 国产一区二区三区四区福利| 午夜精品蜜臀一区二区三区免费| 久久精品国产精品亚洲| 日韩亚洲国产中文字幕| 久久久久久久久国产精品| 成人免费网站在线| 国内揄拍国内精品| 国产欧美一区二区三区视频| 91九色蝌蚪国产| 欧美激情a∨在线视频播放| 久热精品视频在线观看| 日本精品久久久久影院| 丝袜一区二区三区| 岛国av一区二区在线在线观看| 国产在线播放91| 国产亚洲精品久久久久久| 久久99青青精品免费观看| 欧美激情aaaa| 午夜免费在线观看精品视频| 亚洲综合av影视| 亚洲女人初尝黑人巨大| 亚洲国产小视频在线观看| 精品久久久久久|