OC方法的懶載入

2021-08-18 09:26:07 字數 2118 閱讀 8828

提到懶載入,或許99%搞ios開發的同學都會用過,眾所周知,懶載入就是用到的時候再載入,通常我們都用作屬性上面,通過self.xx來實現。那麼oc方法的懶載入你聽說過嗎?用過嗎?下面就是通過runtime來實現一下方法的懶載入,玩一下。

首先建立乙個person類,.h檔案裡面什麼都不用寫

viewcontroller中匯入標頭檔案開始玩

viewdidload方法中初始化person並呼叫person的eat方法,此時可以看到xcode編譯警告eat方法,如果我們現在執行**,就會crash,因為找不到這個方法,找到person.m

objective c 提供了一種名為動態方法決議的手段,使得我們可以在執行時動態地為乙個 selector 提供實現。我們只要實現 +resolveinstancemethod: 或 +resolveclassmethod: 方法,並在其中為指定的 selector 提供實現即可(通過呼叫執行時函式 class_addmethod 來新增)。這兩個方法都是 nsobject 中的類方法,其原型為:

+ (bool)resolveclassmethod:(sel)name; 

+ (bool)resolveinstancemethod:(sel)name;

簡單來說就是,當這個類被呼叫了沒有實現的方法,就會進入該方法來。

引數 name 是需要被動態決議的 selector;返回值文件中說是表示動態決議成功與否。但在上面的例子中(不涉及訊息**的情況下),如果在該函式內為指定的 selector  提供實現,無論返回 yes 還是 no,編譯執行都是正確的;但如果在該函式內並不真正為 selector 提供實現,無論返回 yes 還是 no,執行都會 crash,道理很簡單,selector 並沒有對應的實現,而又沒有實現訊息**。

resolveinstancemethod 是為物件方法進行決議,

而 resolveclassmethod 是為類方法進行決議。

先簡單執行一下**,列印一下sel看看方法是什麼

可以清楚的看到就是之前呼叫的eat,接下來用動態方法決議手段來修改上面的**:

解析:

這個函式裡面有4個引數,我們開啟幫助看看官方是怎麼說的。

引數1,需要新增方法的類。[pseron class]

引數2,需要新增的方法,就是引數sel,剛才nslog過了,就是eat

引數3就比較複雜了,書面翻譯是需要填入乙個函式,而這個函式需要有兩個引數乙個是self,乙個是_cmd。那麼我們可以返回剛才的實現**看一下,這裡又get了乙個知識點就是,所有的c語言的函式裡面,都有這兩個隱式引數,只要呼叫系統都會傳遞進來。然後繼續看官方文件,class_addmethod([self class], @selector(resolvethismethoddynamically), (imp) mymethodimp, "v@:"); 這是官方給出的呼叫方式。 可以看到,引數3是用(imp)強轉過的函式,所以引數3就是(imp)eat

官方文件

因為我們的eat返回值是void,所以使用"v",加上官方要求的值放在一起就是"v@:"。

接下來我們實現一下帶引數的方法

[p performselector:@selector(play:) withobject:@"王者榮耀"];

帶引數的方法

我們在引數四字串後面繼續拼接引數就好。

mysql懶載入 mybatis懶載入

1.概念 懶載入就是按需載入,我們需要什麼的時候再去進行什麼操作。而且先從單錶查詢,需要時再從關聯表去關聯查詢,能很大提高資料庫效能,因為查詢單錶要比關聯查詢多張表速度要快。在mybatis中,resultmap可以實現高階對映 使用association collection實現一對一及一對多對映...

spring的懶載入和非懶載入

因為這樣在配置中的任何錯誤就會即刻被發現 否則的話可能要花幾個小時甚至幾天 有時候這種預設處理可能並不是 在xml配置檔案中,延遲初始化將通過元素中的 lazy init 屬性來進行控制。例如 html view plain copy beanid lazy class com.foo.expens...

路由懶載入與元件懶載入

一 為什麼要使用路由懶載入 為給客戶更好的客戶體驗,首屏元件載入速度更快一些,解決白屏問題。二 定義 懶載入簡單來說就是延遲載入或按需載入,即在需要的時候的時候進行載入。三 使用 常用的懶載入方式有兩種 即使用vue非同步元件 和 es中的import 1 不用懶載入,vue中路由 如下 impor...