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

首頁 > 編程 > Swift > 正文

swift中利用runtime交換方法的實現示例

2020-03-09 17:31:53
字體:
來源:轉載
供稿:網友

前言

Runtime介紹

學習一個東西至少要先知道它是個啥,你一定聽說過“運行時是 Objective-C 的一個特色”,這里的“運行時”就是指 runtime 了。

老的方式initialize現在已經不適用了,需要用新的方式代替。

思路: 定義一個啟動的協議,在app完成啟動的方法里把需要做method swizzle的類跑一邊協議的方法

第一種

1、Step One

 protocol SelfAware: class {  static func awake() } class NothingToSeeHere {  static func harmlessFunction() {   let typeCount = Int(objc_getClassList(nil, 0))   let types = UnsafeMutablePointer<AnyClass?>.allocate(capacity: typeCount)   let autoreleasingTypes = AutoreleasingUnsafeMutablePointer<AnyClass?>(types)    objc_getClassList(autoreleasingTypes, Int32(typeCount))   for index in 0 ..< typeCount { (types[index] as? SelfAware.Type)?.awake() }   types.deallocate(capacity: typeCount)  } }

2、step two

 extension UIApplication {   private static let runOnce: Void = {    NothingToSeeHere.harmlessFunction()   }()  override open var next: UIResponder? {    // Called before applicationDidFinishLaunching    UIApplication.runOnce    return super.next  } } 

3、step three

遵循協議SelfAware,實現awake()

第二種(類似第一種)

1、創建一個swizzle注入的協議

public protocol SwizzlingInjection: class { static func inject()}

2、創建swizzle helper

open class SwizzlingManager { //只會調用一次的方法 private static let doOnce: Any? = {  UIViewController.inject()  return nil }()  open static func enableInjection() {  _ = SwizzlingManager.doOnce }}

3、給UIApplication 創建分類調用那個一次方法

extension UIApplication{ open override var next: UIResponder?{  SwizzlingManager.enableInjection()  return super.next }}

4、在你需要的類中遵循注入協議

extension UIViewController: SwizzlingInjection{  public static func inject() {  //確保不是子類  guard self === UIViewController.self else { return }    DispatchQueue.once(token: "com.moglo.urmoji.UIViewController") {   //do swizzle method  } }}

once只執行一次的方法

public extension DispatchQueue {  private static var _onceTracker = [String]()  public class func once(file: String = #file, function: String = #function, line: Int = #line, block:()->Void) {  let token = file + ":" + function + ":" + String(line)  once(token: token, block: block) }  /**  Executes a block of code, associated with a unique token, only once. The code is thread safe and will  only execute the code once even in the presence of multithreaded calls.    - parameter token: A unique reverse DNS style name such as com.vectorform.<name> or a GUID  - parameter block: Block to execute once  */ public class func once(token: String, block:()->Void) {  objc_sync_enter(self)  defer { objc_sync_exit(self) }  if _onceTracker.contains(token) {   return  }  _onceTracker.append(token)  block() } //delay typealias Task = (_ cancel : Bool) -> Void @discardableResult static func delay(time : TimeInterval, task: @escaping () -> ()) -> Task? {    func dispatch_later(block : @escaping () -> ()) {   DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + time , execute: block)  }    var closure : (() -> ())? = task  var result : Task?  let delayedClosure : Task = {   cancel in   if let internalClosure = closure {    if cancel == false {     DispatchQueue.main.async(execute: internalClosure)    }   }   closure = nil   result = nil  }    result = delayedClosure  dispatch_later { () -> () in   if let delayedClosure = result {    delayedClosure(false)   }  }  return result }  static func cancel(task : Task?) {  task?(true) }}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www欧美日韩| 午夜精品一区二区三区在线播放| 国产一区二区三区在线| 一区二区三区视频免费| 国产精品吹潮在线观看| 国产亚洲精品美女| 中文字幕久久久av一区| 日韩成人中文字幕| 久久精品成人一区二区三区| 精品日韩中文字幕| 久久久久久国产| 久久的精品视频| 亚洲精美色品网站| 亚洲一区二区中文| 欧美激情在线播放| 久久久久国产精品www| 国产成人精品999| 色99之美女主播在线视频| 自拍亚洲一区欧美另类| 亚洲欧洲偷拍精品| 国产99久久精品一区二区 夜夜躁日日躁| 久久久久久国产免费| 91日韩在线播放| 一夜七次郎国产精品亚洲| 国色天香2019中文字幕在线观看| 色悠悠国产精品| 国产欧美最新羞羞视频在线观看| 国产成人精品视频在线| 国产视频在线观看一区二区| 国产精品视频自拍| 午夜免费在线观看精品视频| 久久理论片午夜琪琪电影网| 国产视频精品va久久久久久| 国产精品久久久久久久久久99| 欧美黑人又粗大| 亚洲精品国产综合久久| 久久久久久久999精品视频| 亚洲欧美日韩爽爽影院| 国产精品美女www爽爽爽视频| 亚洲自拍偷拍色图| 日韩av影院在线观看| 日韩精品免费在线视频观看| 色樱桃影院亚洲精品影院| 海角国产乱辈乱精品视频| 一区二区三区视频在线| 久久精品国产精品| 亚洲一区二区免费在线| 欧美肥老太性生活视频| 国产精品十八以下禁看| 成人在线观看视频网站| 欧美韩国理论所午夜片917电影| 午夜精品一区二区三区在线| 久久久精品影院| 亚洲精品久久久久中文字幕欢迎你| 欧洲美女免费图片一区| 九色成人免费视频| 久久99精品久久久久久噜噜| 最近日韩中文字幕中文| 国产精品视频大全| 国产91成人video| 国产福利视频一区二区| 国产一区二区三区18| 精品无人区太爽高潮在线播放| 欧美激情影音先锋| 精品亚洲va在线va天堂资源站| 色偷偷噜噜噜亚洲男人的天堂| 日韩美女av在线免费观看| 91沈先生作品| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品黄色影片导航在线观看| 91av在线免费观看视频| 亚洲综合在线小说| 国产成人激情视频| 亚洲精品福利免费在线观看| 国产日韩在线观看av| 日韩av电影中文字幕| 亚洲激情在线观看视频免费| 久久青草精品视频免费观看| 欧美日韩色婷婷| 国产午夜精品理论片a级探花| 久久久久久欧美| 国产成人av网| 欧美一区亚洲一区| 成人激情视频在线| 另类美女黄大片| 欧美日韩加勒比精品一区| 日本精品一区二区三区在线| 亚洲日本中文字幕免费在线不卡| 中文字幕亚洲字幕| 亚洲色图第一页| 欧美高清视频在线| 亚洲美女精品成人在线视频| 亚洲日韩欧美视频一区| 日韩欧美一区视频| 日韩精品欧美国产精品忘忧草| 日韩中文第一页| 久久五月天综合| 黑人巨大精品欧美一区免费视频| 日韩电影视频免费| 欧美性做爰毛片| www.久久色.com| 亚洲免费精彩视频| 欧美日韩xxx| 最新的欧美黄色| 成人乱人伦精品视频在线观看| 亚洲国产婷婷香蕉久久久久久| 国产丝袜一区视频在线观看| 91大神在线播放精品| 51ⅴ精品国产91久久久久久| 一夜七次郎国产精品亚洲| 亚洲午夜小视频| 欧洲午夜精品久久久| 亚洲精品中文字| 国产脚交av在线一区二区| 亚洲精品第一页| 国产精品综合网站| 国产精品美女无圣光视频| 91久久精品国产| 亚洲欧美国产精品| 欧美精品一二区| 蜜臀久久99精品久久久久久宅男| 亚洲香蕉成视频在线观看| 欧美日韩国产激情| 国产精品久久久久久久电影| 久久精品人人做人人爽| 亚洲视频综合网| 欧美另类在线播放| 日本久久久久久| 国产亚洲精品久久久久动| 久久夜精品香蕉| 国产亚洲视频中文字幕视频| 国产精品手机播放| 夜夜嗨av一区二区三区四区| 成人亚洲欧美一区二区三区| 国产成人亚洲精品| 日韩在线一区二区三区免费视频| 色99之美女主播在线视频| 日韩av电影在线免费播放| 国产精品96久久久久久又黄又硬| 91精品在线一区| 色综合色综合网色综合| 亚洲精品456在线播放狼人| 国产福利精品视频| 狠狠躁夜夜躁人人躁婷婷91| 欧美乱妇40p| 久久这里只有精品视频首页| 91免费在线视频网站| 国产日韩精品一区二区| 国产一区二区三区网站| 亚洲黄色免费三级| 国产97在线视频| 福利一区福利二区微拍刺激| 亚洲性生活视频在线观看| 国产精品久久久久久久久久三级| 国产成人高潮免费观看精品| 日本欧美爱爱爱| 日韩高清电影免费观看完整版| 日韩高清中文字幕| 日韩av免费在线播放| 伊人伊成久久人综合网站| 久久精品国产视频| 欧美麻豆久久久久久中文| 欧美亚洲另类在线| 国产精品丝袜白浆摸在线|