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

首頁 > 系統 > iOS > 正文

使用objc runtime實現iOS閉環的懶加載功能

2020-07-26 02:19:45
字體:
來源:轉載
供稿:網友

使用objc runtime實現懶加載

地址:AutoPropertyCocoa

懶加載形式如下

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

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

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

主要流程:

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

難點:

自己實現method swizzling

  1.  重新實現objc1時代的方法class_removeMethods
  2.  鉤住運行時中的runtimelock,實現修改類型數據時的安全性

我們再實現method swizzling時的兩個API

OBJC_EXPORT IMP _Nullableclass_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 voidmethod_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2)   OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);

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

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

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

首先看類讀寫器的結構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>,它是數組結構。存儲的內容是method_list_t.

method_list_t又繼承于entsize_list_tt<method_t, method_list_t, 0x3>,他也是數組結構。

整個method_array_t結構是二維數組。每次刪掉一個method_t需要用新method_list_t替換原對象。

 

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

最終采取的方式是:劫持暴露了符號的系統函數然后阻塞線程

 

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

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

  1. 該函數在符號表中存在
  2. 函數內部在lock runtimelock之后存在滿足條件1的第二個函數

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

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文国产成人精品| 国产一区二区动漫| 97av在线影院| 国产精品久久久久久久久久| 亚洲成人激情图| 日韩一区二区欧美| 亚洲人在线视频| 欧美日韩在线免费观看| 中文字幕在线看视频国产欧美在线看完整| 欧美精品video| 欧美午夜美女看片| 亚洲日本中文字幕免费在线不卡| 一区二区三区国产在线观看| 欧美一级电影免费在线观看| 久久69精品久久久久久国产越南| 色午夜这里只有精品| 欧美一区二区三区……| 欧美洲成人男女午夜视频| 欧美黑人国产人伦爽爽爽| 琪琪亚洲精品午夜在线| 国产精品自产拍在线观| 国产精品日日摸夜夜添夜夜av| 亚洲xxxx在线| 久久视频免费观看| 国产精品美女无圣光视频| 亚洲国产精品嫩草影院久久| 亚洲欧洲日韩国产| 欧美电影免费在线观看| 欧美激情精品久久久久久蜜臀| 日韩毛片中文字幕| 亚洲欧美中文字幕在线一区| 91久久久亚洲精品| 欧美最顶级的aⅴ艳星| 久久精品国产v日韩v亚洲| 国产欧美日韩免费| 成人免费网视频| 日韩国产欧美精品在线| xx视频.9999.com| 91香蕉嫩草神马影院在线观看| 91精品国产91久久久久久吃药| 亚洲sss综合天堂久久| 国产精欧美一区二区三区| 国产丝袜一区二区| 日韩av黄色在线观看| 亚洲偷熟乱区亚洲香蕉av| 国产91在线播放| 亚洲国产成人精品久久久国产成人一区| 91精品视频免费| 亚洲国产福利在线| 国产极品精品在线观看| 日韩欧美第一页| 亚洲精品自拍偷拍| 亚洲欧美精品suv| 97热精品视频官网| 国产成人精品久久| 国产精品白嫩美女在线观看| 欧美黑人视频一区| 亚洲免费中文字幕| 福利视频第一区| 高清欧美一区二区三区| 久久亚洲国产成人| 成人h猎奇视频网站| 亚洲人成亚洲人成在线观看| 91国偷自产一区二区三区的观看方式| 成人激情视频小说免费下载| 中文字幕日韩欧美精品在线观看| 国产精品免费视频久久久| 91国产视频在线播放| 国产精品欧美亚洲777777| 亚洲www在线观看| 欧美日韩国产丝袜另类| 国内免费久久久久久久久久久| 久久人91精品久久久久久不卡| 日韩精品视频三区| 亚洲国产三级网| 国产欧美日韩中文字幕在线| 欧美激情国内偷拍| 国产美女主播一区| 精品国产91久久久久久老师| 欧美午夜电影在线| 亚洲精品国产精品自产a区红杏吧| 欧洲精品久久久| 日韩在线观看免费av| 欧美激情一区二区三区久久久| 国产精品男人爽免费视频1| 久久91亚洲人成电影网站| 亚洲色图五月天| 国产欧美日韩精品专区| 亚洲精品视频免费在线观看| 久久精品国产一区二区电影| 97婷婷大伊香蕉精品视频| 亚洲男人天堂网站| 国产欧美精品va在线观看| 久99久在线视频| 亚洲视频自拍偷拍| 欧美日韩成人在线视频| 国产成人一区三区| 久久久www成人免费精品| 亚洲xxxx妇黄裸体| 亚洲新中文字幕| 国产午夜精品视频| 亚洲第一区第二区| 色妞欧美日韩在线| 国色天香2019中文字幕在线观看| 欧美麻豆久久久久久中文| 97国产精品免费视频| 7777kkkk成人观看| 亚洲free性xxxx护士hd| 青草成人免费视频| 亚洲激情视频网站| 色综合伊人色综合网站| 亚洲精品suv精品一区二区| 日韩av手机在线观看| 日韩免费在线免费观看| 亚洲女成人图区| 国产中文欧美精品| 亚洲国产欧美日韩精品| 国产精品私拍pans大尺度在线| 色婷婷亚洲mv天堂mv在影片| 97在线视频国产| 亚洲人成毛片在线播放| 91久久夜色精品国产网站| 亚洲欧美日韩精品| 亚洲夜晚福利在线观看| 成人日韩av在线| 亚洲国产高清福利视频| 亚洲理论电影网| 亚洲网站在线观看| 欧美一区第一页| 综合136福利视频在线| 国产日韩一区在线| 亚洲福利在线视频| 亚洲激情小视频| 欧美资源在线观看| 成人情趣片在线观看免费| 国产一区二区三区毛片| 欧美激情第一页xxx| 欧美高清videos高潮hd| 日韩高清欧美高清| 成人国产精品日本在线| 国产欧美日韩精品专区| 国产精品美女999| 中文字幕日韩在线播放| 尤物精品国产第一福利三区| 一本一本久久a久久精品牛牛影视| 91精品啪在线观看麻豆免费| 538国产精品一区二区在线| 另类专区欧美制服同性| 国产精品第一页在线| 国产在线视频一区| 精品国产欧美一区二区三区成人| 97免费在线视频| 亚洲人成电影网| 在线亚洲午夜片av大片| 91av在线免费观看| 欧美日韩精品在线播放| 亚洲跨种族黑人xxx| 97色在线播放视频| 日韩在线播放视频| 91精品国产高清久久久久久91| 热久久免费国产视频| 91国内揄拍国内精品对白| 亚洲视频自拍偷拍| 自拍偷拍亚洲在线|