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

swift中利用runtime交換方法的實(shí)現(xiàn)示例

 更新時間:2018年05月08日 11:07:01   作者:小峰書  
這篇文章主要給大家介紹了關(guān)于swift中利用runtime交換方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

Runtime介紹

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

老的方式initialize現(xiàn)在已經(jīng)不適用了,需要用新的方式代替。

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

第一種

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

遵循協(xié)議SelfAware,實(shí)現(xiàn)awake()

第二種(類似第一種)

1、創(chuàng)建一個swizzle注入的協(xié)議

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

2、創(chuàng)建swizzle helper

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

3、給UIApplication 創(chuàng)建分類調(diào)用那個一次方法

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

4、在你需要的類中遵循注入?yún)f(xié)議

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

once只執(zhí)行一次的方法

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)
 }
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Swift教程之函數(shù)詳解

    Swift教程之函數(shù)詳解

    這篇文章主要介紹了Swift教程之函數(shù)詳解,本文講解了函數(shù)的聲明與調(diào)用、函數(shù)的參數(shù)和返回值、函數(shù)參數(shù)名、函數(shù)類型等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • 詳解Swift?中的幻象類型

    詳解Swift?中的幻象類型

    讓我們來看看一種技術(shù),它可以讓我們利用?Swift?的類型系統(tǒng)在編譯時執(zhí)行更多種類的數(shù)據(jù)驗(yàn)證消除更多潛在的歧義來源,并幫助我們在整個代碼庫中保持類型安全,通過使用幻象類型(phantom?types),對Swift?幻象類型相關(guān)知識感興趣的朋友一起看看吧
    2022-05-05
  • Swift使用Cocoa中的數(shù)據(jù)類型教程

    Swift使用Cocoa中的數(shù)據(jù)類型教程

    這篇文章主要介紹了Swift使用Cocoa中的數(shù)據(jù)類型教程,Swift 會自動將一些 Objective-C 類型轉(zhuǎn)換為 Swift 類型,以及將 Swift 類型轉(zhuǎn)換為 Objective-C 類型,需要的朋友可以參考下
    2014-07-07
  • Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法

    Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法

    本篇文章主要介紹了Swift如何在應(yīng)用中添加圖標(biāo)更換功能的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Flutter iOS開發(fā)OC混編Swift動態(tài)庫和靜態(tài)庫問題填坑

    Flutter iOS開發(fā)OC混編Swift動態(tài)庫和靜態(tài)庫問題填坑

    這篇文章主要為大家介紹了Flutter iOS OC 混編 Swift動態(tài)庫和靜態(tài)庫問題填坑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • swift如何利用系統(tǒng)庫將漢字轉(zhuǎn)換為拼音詳解

    swift如何利用系統(tǒng)庫將漢字轉(zhuǎn)換為拼音詳解

    將漢字轉(zhuǎn)換為拼音更利于我們大家開發(fā)搜索功能,所以這篇文章主要給大家介紹了關(guān)于swift如何利用系統(tǒng)庫將漢字轉(zhuǎn)換為拼音的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • 詳解Swift中的下標(biāo)訪問用法

    詳解Swift中的下標(biāo)訪問用法

    在Swift中我們可以用subscript函數(shù)來定義下標(biāo),從而通過下標(biāo)來訪問數(shù)組與字典等數(shù)據(jù)結(jié)構(gòu),這里我們就來詳解Swift中的下標(biāo)訪問用法:
    2016-07-07
  • Swift Set集合及常用方法詳解總結(jié)

    Swift Set集合及常用方法詳解總結(jié)

    Set集合為集類型,集是最簡單的一種集合,存放于集中的對象不按特定方式排序,只是簡單地把對象加入集合中,類似于向口袋里放東西,對集中存在的對象的訪問和操作是通過對象的引用進(jìn)行的,因此在集中不能存放重復(fù)對象
    2021-11-11
  • 深入講解Swift的內(nèi)存管理

    深入講解Swift的內(nèi)存管理

    不管在什么語言里,內(nèi)存管理的內(nèi)容都很重要,Swift使用自動引用計數(shù)來管理應(yīng)用程序的內(nèi)存使用。這表示內(nèi)存管理已經(jīng)是Swift的一部分,在大多數(shù)情況下,你并不需要考慮內(nèi)存的管理。本文主要介紹了Swift中內(nèi)存管理的相關(guān)資料,需要的朋友可以參考。
    2017-03-03
  • 在Mac OS的終端中運(yùn)行Swift應(yīng)用的方法

    在Mac OS的終端中運(yùn)行Swift應(yīng)用的方法

    這篇文章主要介紹了在Mac OS的終端中運(yùn)行Swift應(yīng)用的方法,依靠Xcode的REPL功能來實(shí)現(xiàn),需要的朋友可以參考下
    2015-07-07

最新評論

响水县| 平陆县| 民和| 双城市| 仙桃市| 城口县| 明溪县| 井研县| 广汉市| 建瓯市| 镇江市| 横峰县| 瑞昌市| 呼和浩特市| 井冈山市| 五原县| 清苑县| 临清市| 通辽市| 建湖县| 彭泽县| 开化县| 赞皇县| 黄陵县| 郎溪县| 新乡市| 阳谷县| 龙胜| 灌阳县| 宿松县| 淳安县| 镇沅| 铜山县| 黄梅县| 彩票| 大城县| 金湖县| 临清市| 钦州市| 方山县| 兖州市|