「iOS 面試之道」勘誤(二)

本文是「iOS 面試之道」勘誤系列的第二篇。git

Swift 初始化方法描述的漏洞

書中 105 頁的描述是:Swift 初始化方法必須保證全部非 Optional 的成員變量都完成初始化。github

這個表述是不嚴謹的。面試

Swift 初始化方法必須保證:swift

  • 全部非 lazy /非 Optional 的可變 stored property
  • 全部非 computed 不可變 stored property

都完成初始化。其中 stored property 的對義語是 computed property。markdown

也就是說下列代碼是不能被成功編譯的,由於 bar 雖然是 Optional 的,可是確實一個不可變成員變量:session

class Foo {
    let bar: String?
    
    init() {
        
    }
}
複製代碼

可是下列代碼又是能夠被成功編譯的:app

class Foo {
    let bar: String = {
        return "Bar"
    }
    
    init() {
        
    }
}
複製代碼

由於上述代碼的 bar 是一個 computed property,而不是 stored property。框架

若是你以爲上述描述實在太難記,那麼只須要記憶如下內容:Swift 會強制全部不可變變量以及可變變量中非 optional 的在變量生命週期的「產生」階段都被初始化。這個「產生」階段對於 classstruct 的 properties 而言就是 init 函數,對於全局變量和函數體內的本地變量而言就是變量聲明的時候。函數

Swift 和 Objective-C 的自省描述有問題

書中 109 頁:oop

... 這兩個方法([NSObject -isKindOfClass:][NSObject -isMemberOfClass:])的使用有一個前提,既 obj 必須是 NSObject 或其子類。

這個表述是有問題的,-isKindOfClass:-isMemberOfClass: 是定義在 NSObject 這個 protocol 之中的,只要聽從 (conformed to) 了這個 protocol 那麼你就能夠使用這兩個方法來進行自省,好比說 NSProxy 及其子類。

實際上 Objective-C runtime 也提供一組 API 來完成相似的功能,只是這組 API 中有些有能夠不檢查 class hierarchy。你若是構建過用來擴展 Objective-C 運行時的框架,那麼你應該會很熟悉。

iOS 動畫實現方式記錄不徹底

iOS 動畫還包括 CADisplayLink 驅動的動畫,比較有名的使用這個類來驅動動畫的 iOS UI 組件就有 LTMorphingLabel。另外有不少遊戲或者三維程序也是用這個類來驅動的。

同時 UIScrollView 也是 iOS 上動畫的重要來源,並且用這玩意兒作動畫比較考驗智力水平。基本上每一年蘋果都會在 WWDC 開專門的 sessions 講如何使用 UIScrollView 及其子類。

Plist 文件介紹不徹底

Plist 在早期還有二進制文件的實現。詳情請看這篇文章

相關文章
相關標籤/搜索