背景: 在看算法书时候, 不少地方提到要谨防递归的栈溢出问题.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
若有任何错误, 请不吝赐教.递归