成人免费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_雨的簡書
相關推薦

2011-07-13 16:14:53

C++引用指針

2024-08-12 08:28:35

2010-01-14 10:35:34

VB.NET指針

2017-10-23 15:46:37

2022-10-30 10:24:43

Join優化Runtime

2011-08-22 10:31:40

iPhone開發BSD Socket

2019-08-08 08:00:00

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

2009-11-10 16:27:45

VB.NET指針

2015-01-21 16:25:29

Swift指針

2011-04-11 11:09:50

this指針

2015-03-16 10:33:14

Swift指針

2011-07-15 01:38:56

C++this指針

2020-05-21 08:58:34

Kubernetes操作系統運維

2017-08-28 16:01:59

前端JavaScript學習途徑

2020-04-28 10:28:30

Kubernetes操作系統運維

2011-01-13 14:54:50

2020-08-13 17:11:29

物聯網數字學習IOT

2015-12-24 09:48:40

JavaScriptthis指針深

2009-07-31 09:20:16

NGWS RuntimASP.NET

2021-06-10 08:51:57

C++指針聲明指針相關概念
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久日韩粉嫩一区二区三区 | 精品亚洲一区二区三区 | 久久久这里只有17精品 | 国产日韩欧美在线观看 | 天堂在线一区 | 亚洲福利在线观看 | 亚洲欧美日韩国产综合 | 国产精品久久久久久久久久 | 伊人色综合久久久天天蜜桃 | 亚洲精品一区中文字幕乱码 | 日韩在线视频免费观看 | 欧美999 | 国产成人精品久久 | 国产免费av在线 | 欧美自拍一区 | 二区三区视频 | 天天影视网天天综合色在线播放 | va在线| 国产传媒在线播放 | 在线免费观看成人 | 国产精品久久久久aaaa樱花 | 欧美精品tv| 亚洲精品中文字幕 | 中文字幕一区二区三区四区五区 | 成人欧美一区二区三区在线观看 | 奇米影视77 | 蜜桃免费一区二区三区 | 国产成人精品免费视频大全最热 | 91精品中文字幕一区二区三区 | 国产欧美一区二区精品久导航 | 国产在线观看免费 | 欧美国产亚洲一区二区 | 午夜视频在线观看视频 | 91久久精品视频 | 国产精品视频在线观看 | 国产一区二区三区视频免费观看 | 91精品久久久久久久久久 | 高清一区二区视频 | 日韩免费在线视频 | 日本黄色一级片视频 | 久久久久久久久久久久一区二区 |