本文是「iOS 面試之道」勘誤系列的第二篇。git
書中 105 頁的描述是:Swift 初始化方法必須保證全部非 Optional
的成員變量都完成初始化。github
這個表述是不嚴謹的。面試
Swift 初始化方法必須保證:swift
都完成初始化。其中 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 的在變量生命週期的「產生」階段都被初始化。這個「產生」階段對於 class
和 struct
的 properties 而言就是 init
函數,對於全局變量和函數體內的本地變量而言就是變量聲明的時候。函數
書中 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 動畫還包括 CADisplayLink
驅動的動畫,比較有名的使用這個類來驅動動畫的 iOS UI 組件就有 LTMorphingLabel。另外有不少遊戲或者三維程序也是用這個類來驅動的。
同時 UIScrollView
也是 iOS 上動畫的重要來源,並且用這玩意兒作動畫比較考驗智力水平。基本上每一年蘋果都會在 WWDC 開專門的 sessions 講如何使用 UIScrollView
及其子類。
Plist 在早期還有二進制文件的實現。詳情請看這篇文章。