最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用objc runtime實現(xiàn)iOS閉環(huán)的懶加載功能

 更新時間:2019年06月13日 16:37:00   作者:米太白  
利用objc runtime的動態(tài)性實現(xiàn)懶加載可以實現(xiàn)即可增加又可刪除功能,也可以避免污染類型。這篇文章主要介紹了使用objc runtime實現(xiàn)iOS閉環(huán)的懶加載功能,需要的朋友可以參考下

使用objc runtime實現(xiàn)懶加載

地址:AutoPropertyCocoa

懶加載形式如下

- (id)lazyloadProperty{

  if(_lazyloadProperty == nil){
  
    _lazyloadProperty = [XClass ...];
  }
  return _lazyloadProperty;
}

一般使用宏定義可以輕松完成。但是沒有一致性,移植差。

利用objc runtime的動態(tài)性實現(xiàn)懶加載可以實現(xiàn)即可增加又可刪除功能,也可以避免污染類型。該三方彌補了目前沒有閉環(huán)實現(xiàn)懶加載三方的空缺。

主要流程:

  1. 實例或者類的懶加載
  2. 如果是實例對象則鉤住并修改類型將其子類化
  3. 對該類型進行method swizzling
  4. 如果現(xiàn)在進行解綁,則判斷是否是自己實現(xiàn)的方法.如果是自己實現(xiàn)的方法->5,否則->6
  5. 調(diào)用method swizzling還原
  6. 刪除這個類型的這個方法

難點:

自己實現(xiàn)method swizzling

  1.  重新實現(xiàn)objc1時代的方法class_removeMethods
  2.  鉤住運行時中的runtimelock,實現(xiàn)修改類型數(shù)據(jù)時的安全性

我們再實現(xiàn)method swizzling時的兩個API

OBJC_EXPORT IMP _Nullable
class_replaceMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, 
          const char * _Nullable types) 
  OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

OBJC_EXPORT void
method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2) 
  OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

不管使用哪種,如果這個類型沒有實現(xiàn)該方法而是父類實現(xiàn)的話,就需要動態(tài)增加一個方法。動態(tài)增加的方法在Objc1時代,是可以通過下列方法刪除的:

OBJC_EXPORT void
class_removeMethods(Class _Nullable, struct objc_method_list * _Nonnull)
  OBJC2_UNAVAILABLE;

Objc2時代之后runtime被重寫后沒有該方法了,并且新的runtime的類結(jié)構(gòu)看起來就沒打算讓開發(fā)者刪除方法,所以這里將過程記下。

首先看類讀寫器的結(jié)構(gòu)class_rw_t

struct class_rw_t {
  // Be warned that Symbolication knows the layout of this structure.
  uint32_t flags;
  uint32_t version;

  const class_ro_t *ro;

  method_array_t methods;//刪除這里的一個方法
  property_array_t properties;
  protocol_array_t protocols;

  Class firstSubclass;
  Class nextSiblingClass;

  char *demangledName;

#if SUPPORT_INDEXED_ISA
  uint32_t index;
#endif
};

method_array_t繼承于list_array_tt<method_t, method_list_t>,它是數(shù)組結(jié)構(gòu)。存儲的內(nèi)容是method_list_t.

method_list_t又繼承于entsize_list_tt<method_t, method_list_t, 0x3>,他也是數(shù)組結(jié)構(gòu)。

整個method_array_t結(jié)構(gòu)是二維數(shù)組。每次刪掉一個method_t需要用新method_list_t替換原對象。

 

然后是線程安全的問題,需要獲取到蘋果在操作類型的時候使用的讀寫鎖(pthread_rw_lock_t runtimelock)。沒有這把鎖任何對runtime的修改都是不可靠的。

最終采取的方式是:劫持暴露了符號的系統(tǒng)函數(shù)然后阻塞線程

 

劫持系統(tǒng)C函數(shù)使用的是臉書的魚鉤,這個鉤子在macOS其實也是可以正常工作的。

剩下的就是尋找合適的函數(shù)了,這函數(shù)要滿足兩個條件:

  1. 該函數(shù)在符號表中存在
  2. 函數(shù)內(nèi)部在lock runtimelock之后存在滿足條件1的第二個函數(shù)

找了半天發(fā)現(xiàn)最合適的只有objc_allocateProtocol()了,objc_allocateProtocol內(nèi)部會調(diào)用calloc(),所以第二個被劫持函數(shù)就是calloc。為了減小calloc的開銷,需要稍微做一些工作。

  1. 對每次調(diào)用進行比較線程ID的操作顯然比暴力阻塞線程好。
  2. 減小劫持后的calloc的調(diào)用棧。

總結(jié)

以上所述是小編給大家介紹的使用objc runtime實現(xiàn)iOS閉環(huán)的懶加載功能,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!

相關(guān)文章

  • iOS bounds學(xué)習(xí)筆記以及仿寫UIScrollView部分功能詳解

    iOS bounds學(xué)習(xí)筆記以及仿寫UIScrollView部分功能詳解

    這篇文章主要為大家詳細(xì)介紹了iOS bounds學(xué)習(xí)筆記,以及仿寫UIScrollView部分功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • iOS開發(fā)之UIScrollView控件詳解

    iOS開發(fā)之UIScrollView控件詳解

    UIScrollView是一個非常重要的控件,其可以展示比設(shè)備屏幕更大區(qū)域的內(nèi)容,我們可以通過手指滑動來查看內(nèi)容視圖的每一部分內(nèi)容,也可以通過手指捏合來對內(nèi)容視圖進行縮放操作,我們每天開發(fā)中都不斷顯式或隱式地與UIScrollView打交道,下面給大家詳細(xì)介紹UIScrollView控件。
    2016-09-09
  • iOS Crash常規(guī)跟蹤方法及Bugly集成運用詳細(xì)介紹

    iOS Crash常規(guī)跟蹤方法及Bugly集成運用詳細(xì)介紹

    這篇文章主要介紹了iOS Crash常規(guī)跟蹤方法及Bugly集成運用詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • iOS動畫之向右拉的抽屜3D效果

    iOS動畫之向右拉的抽屜3D效果

    首先說下,其實一切的動畫都是假象,3D效果也是這樣.本篇我們來做一個這樣的特效.來跟著小編一起學(xué)習(xí)學(xué)習(xí)。
    2016-08-08
  • iOS表情鍵盤的簡單實現(xiàn)代碼

    iOS表情鍵盤的簡單實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了iOS表情鍵盤的簡單實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Objective-C關(guān)鍵字@property使用原理探究

    Objective-C關(guān)鍵字@property使用原理探究

    這篇文章主要為大家介紹了Objective-C關(guān)鍵字@property使用原理探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • UIWebView控件中字體大小和字體樣式的修改

    UIWebView控件中字體大小和字體樣式的修改

    本文主要介紹了UIWebView控件中字體大小和字體樣式的修改,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • iOS 純代碼寫個側(cè)滑欄功能

    iOS 純代碼寫個側(cè)滑欄功能

    下面小編就為大家分享一篇iOS 純代碼寫個側(cè)滑欄功能,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS應(yīng)用中UILabel文字顯示效果的常用設(shè)置總結(jié)

    iOS應(yīng)用中UILabel文字顯示效果的常用設(shè)置總結(jié)

    UILabel組件可以用來設(shè)置文字內(nèi)容的排版與字體效果等,功能非常多,下面就來為大家整理一下基本的iOS應(yīng)用中UILabel文字顯示效果的常用設(shè)置總結(jié)
    2016-05-05
  • iOS開發(fā)之運動事件和遠程控制

    iOS開發(fā)之運動事件和遠程控制

    在iOS中事件分為三類:觸摸事件:通過觸摸、手勢進行觸發(fā)(例如手指點擊、縮放),運動事件:通過加速器進行觸發(fā)(例如手機晃動),遠程控制事件:通過其他遠程設(shè)備觸發(fā)(例如耳機控制按鈕)今天我們來詳細(xì)探討下運動事件和遠程控制
    2016-04-04

最新評論

龙山县| 上蔡县| 祁东县| 晋城| 托克逊县| 营口市| 缙云县| 大名县| 兴化市| 恩施市| 甘南县| 余江县| 灵川县| 威信县| 贺兰县| 恩施市| 九寨沟县| 普陀区| 周至县| 保德县| 永福县| 米脂县| 延吉市| 澄江县| 昭通市| 紫金县| 昌吉市| 都安| 寻甸| 海丰县| 于田县| 邢台市| 武穴市| 平舆县| 白朗县| 布拖县| 博罗县| 庆元县| 松潘县| 若羌县| 凤凰县|