iOS开发笔记1

1.在堆上模拟函数调用栈

背景: 在看算法书时候, 不少地方提到要谨防递归的栈溢出问题.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)

2.去掉WKWebView弹出键盘的ToolBar

原理就是替换原有的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!)
    }
}

3.关于HuggingPriority和CompressionResistance

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对象

4.项目添加预处理宏定义

添加自定义预处理宏定义意义在于,当你须要beta版本时候你能够为beta版本作特殊的证书配置,环境配置等等。blog

若有任何错误, 请不吝赐教.递归

相关文章
相关标签/搜索