成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

輕松學習之Runtime中IMP指針的作用

移動開發
可能大家一直看到有許多朋友在Runtime相關文章中介紹IMP指針的概念,那么IMP究竟有什么實際作用呢?

 

可能大家一直看到有許多朋友在Runtime相關文章中介紹IMP指針的概念,那么IMP究竟有什么實際作用呢?讓我們先從一個函數看起來。

Method Swizzling

如果對Runtime有一定了解的話,一定聽說過或者用過這個函數:

  1. void method_exchangeImplementations(Method m1, Method m2) 

它通常叫做method swizzling,算是ObjC的"黑魔法"了,作用就是在程序運行期間動態的給兩個方法互換實現,比如有這樣一種使用場景:

我們的程序中有許多個ViewController,我想在對項目改動最小的情況下,在當每個Controller執行完ViewDidLoad以后就在控制臺把自己的名字打印出來,方便我去做調試或者了解項目結構。

有許多朋友會這樣說,讓所有控制器都繼承一個BaseController不就可以了嗎?我在這里要解釋一下這樣做的缺點:假如你的項目里有許多Controller的話,你就需要把項目里凡是沒有繼承自BaseController的每個Controller都做一次修改了,而且隨意更改層級結構會發生意想不到的錯誤。

其實我們的目的就是重寫ViewDidLoad的方法,并在他的方法***加上幾句Log,所以我們需要給UIViewController建立一個category,因為我們知道,如果在Catagory中重寫一個方法,就會覆蓋它的原有方法實現,但是,這樣做以后就沒有辦法調用系統原有的方法,因為在一個方法里調用自己的方法會是一個死循環。所以我們的解決辦法就是,另外寫一個方法來和viewDidLoad“交換”,這樣外部調用viewDidLoad就會調到新建的這個方法中,同樣,我們調用新建的方法就會調用到系統的viewDidLoad中了。

blob.png

IMP指針

其實,還有一種更加簡單的方法可以讓我們辦到相同的目的,運用IMP指針,IMP就是Implementation的縮寫,顧名思義,它是指向一個方法實現的指針,每一個方法都有一個對應的IMP,所以,我們可以直接調用方法的IMP指針,來避免方法調用死循環的問題。

調用一個IMP的方式和調用普通C函數相同,比如:

  1. id returnObjc = someIMP(objc,SEL,params...); 

不過如果你的項目沒有做其他配置的話這樣調用編譯器是不會通過的,我們來看一下先它的定義:

  1. if !OBJC_OLD_DISPATCH_PROTOTYPES 
  2. typedef void (*IMP)(void /* id, SEL, ... */ );  
  3. else 
  4. typedef id (*IMP)(id, SEL, ...);  
  5. endif 

在默認情況下你的工程是打開這個配置的

blob.png

這種情況下IMP被定義為無參數無返回值的函數。所以你需要到工程里搜索到這個選項并把它關閉。這樣的麻煩就是,每次使用,你都需要修改工程配置,所以這里我再介紹另外一種辦法:重新定義一個和有參數的IMP指針相同的指針類型,在獲取IMP時把它強轉為此類型。這樣運用IMP指針后,就不需要額外的給ViewController寫新的方法:

blob.png

還有一個地方我們需要注意,如果這樣直接調用IMP的話就會發生經典的EXC_BAD_ACCESS錯誤,我們定義的IMP指針是一個有返回值的類型,而其實我們獲取的viewDidLoad這個方法是沒有返回值的,所以我們需要新定義一個和IMP相同類型的函數指針比如VIMP,把他的返回值定位Void,這樣如果你修改的方法有返回值就用IMP,沒有返回值就用VIMP。

blob.png

blob.png

值得注意的是,如果你重寫的方法有返回值,不要忘記在***做return。

總結

實際上直接調用一個方法的IMP指針的效率是高于調用方法本身的,所以,如果你有一個合適的時機獲取到方法的IMP的話,你可以試著調用它。

這是只是IMP使用的場景之一,它還有許多作用,希望大家多多發現。

責任編輯:倪明 來源: J_雨的簡書
相關推薦

2024-08-12 08:28:35

2011-07-13 16:14:53

C++引用指針

2017-10-23 15:46:37

2010-01-14 10:35:34

VB.NET指針

2019-08-08 08:00:00

深度學習機器學習神經網絡

2011-08-22 10:31:40

iPhone開發BSD Socket

2022-10-30 10:24:43

Join優化Runtime

2020-04-28 10:28:30

Kubernetes操作系統運維

2011-01-13 14:54:50

2020-05-21 08:58:34

Kubernetes操作系統運維

2017-08-28 16:01:59

前端JavaScript學習途徑

2009-11-10 16:27:45

VB.NET指針

2011-04-11 11:09:50

this指針

2015-03-16 10:33:14

Swift指針

2015-01-21 16:25:29

Swift指針

2009-10-26 13:25:05

Linux Shell

2022-03-17 17:08:05

機器學習算法類型

2011-07-15 01:38:56

C++this指針

2020-08-13 17:11:29

物聯網數字學習IOT

2009-07-31 09:20:16

NGWS RuntimASP.NET
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色偷偷噜噜噜亚洲男人 | 久久99精品久久久97夜夜嗨 | 99精品视频免费观看 | av在线播放不卡 | 91中文在线观看 | 亚洲精品一区二区三区在线观看 | 久久精品日| 婷婷久久综合 | 一区二区三区久久久 | 久久r免费视频 | 日韩欧美三区 | 正在播放一区二区 | 精品视频在线观看 | 手机看片169 | 亚洲国产精品99久久久久久久久 | 麻豆av一区二区三区久久 | 狠狠艹 | 欧美中文在线 | 又黄又爽的网站 | 黑人精品xxx一区一二区 | 欧美综合一区二区三区 | 成人毛片网 | 午夜视频免费在线观看 | 成人二区三区 | 97精品久久| 你懂的在线视频播放 | 毛片网在线观看 | 亚洲在线一区 | 麻豆一区二区三区精品视频 | 亚洲国产成人在线视频 | 国产综合精品一区二区三区 | 天天操网 | 久久网亚洲 | 99久久婷婷| 亚洲 欧美 日韩 在线 | 性一爱一乱一交一视频 | 日本天天操 | 欧美精品在线一区 | 久久久一区二区三区 | 国产麻豆乱码精品一区二区三区 | 欧洲免费视频 |