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

若有任何錯誤, 請不吝賜教.遞歸

相關文章
相關標籤/搜索