背景: 在看算法書時候, 不少地方提到要謹防遞歸的棧溢出問題.html
分析: 遞歸調用時候, 有可能出現很是深的函數調用. 對於每次的函數調用, 都須要將函數體內的局部變量保存在棧上, 若是函數體內包含大量的局部變量, 那麼每次遞歸都會佔用大量的棧空間, 很是容易致使棧溢出崩潰.web
通過分析發現, 遞歸的棧溢出主要是局部變量佔用太多空間而致使的. 那麼咱們只要想辦法將局部變量封裝起來放在堆上, 那麼就能減小棧上空間的佔用, 從而防止棧溢出.算法
青蛙跳臺階問題的遞歸算法以下所示(Swift).函數
// 定義一個對象, 用來存儲局部變量信息 class FakeStack { var num: Int init(num: Int) { self.num = num } func nextStep() -> Int { if num == 1 { return 1 } if num == 2 { return 2 } return FakeStack(num: num - 1).nextStep() + FakeStack(num: num - 2).nextStep() } } //棧上的函數調用 let stepNumber = FakeStack(num: 10).nextStep() print(stepNumber)
原理就是替換原有的WKContentView,在新的NoInputAccessoryView中的inputAccessoryView
屬性中返回nil。code
final class FauxBarHelper: NSObject { @objc var inputAccessoryView: AnyObject? { return nil } func removeInputAccessoryView(webView: WKWebView) { var targetView: UIView? = nil for view in webView.scrollView.subviews { if String(describing: type(of: view)).hasPrefix("WKContent") { targetView = view } } guard let target = targetView else { return } let noInputAccessoryViewClassName = "\(target.superclass!)_NoInputAccessoryView" var newClass: AnyClass? = NSClassFromString(noInputAccessoryViewClassName) if newClass == nil { let targetClass: AnyClass = object_getClass(target)! newClass = objc_allocateClassPair(targetClass, noInputAccessoryViewClassName.cString(using: String.Encoding.ascii)!, 0) } let originalMethod = class_getInstanceMethod(FauxBarHelper.self, #selector(getter: FauxBarHelper.inputAccessoryView)) class_addMethod(newClass!.self, #selector(getter: FauxBarHelper.inputAccessoryView), method_getImplementation(originalMethod!), method_getTypeEncoding(originalMethod!)) object_setClass(target, newClass!) } }
setContentHuggingPriority ==> 抗拉伸-此view不想被拉伸
setContentCompressionResistancePriority ==> 抗壓縮-此view不想被壓縮
舉個例子,當有兩個橫排的label,當左右label數據都被填滿致使label顯示文字長度不夠的時候,若是左邊label設置了setContentCompressionResistancePriority
,則系統會盡量將左邊label文字顯示所有,從而壓縮右邊label;若是左邊設置setContentHuggingPriority
,當左右空間都足夠的時候,右邊label會被拉伸,而左邊label寬度會盡可能以顯示徹底內容的最小寬度顯示內容。htm
參考連接:
https://www.jianshu.com/p/5cf559435eb9
https://www.cnblogs.com/wobuyayi/p/9501391.html對象
添加自定義預處理宏定義意義在於,當你須要beta版本時候你能夠爲beta版本作特殊的證書配置,環境配置等等。blog
若有任何錯誤, 請不吝賜教.遞歸