覆蓋initialize()
對於在類發送其第一條消息(設置UserDefaults等)之前執行代碼很普遍。該文件指出,一個父類的實現可以被多次調用子類不重寫initialize()
,並給予上述做法的例子,以保護類器件執行代碼不止一次如果initialize()
多次調用:覆蓋AppDelegate上的初始化 - 防止多次執行代碼
的如果子類不實現
initialize()
- 運行時將調用繼承的實現 - 或者如果子類顯式調用[super initialize]
,則超類實現可能會被多次調用。如果你想保護自己免受多次運行,你可以在構造實現沿着這些線路:+ (void)initialize { if (self == [ClassName self]) { // ... do the initialization ... } }
我重寫我的AppDelegate initialize()
,並試圖避免多次運行有代碼。類檢查對我來說沒有意義,因爲檢查self is AppDelegate.Type
是否總是會評估爲真(並在Xcode中給我一個警告)。
由於我們不是超類(AppDelegate
的超類是UIResponder
),類檢查是否不適用?我的覆蓋initialize()
方法的內容只會運行一次,而不呼叫super
或執行班級檢查?
我想如果你使用'==='而不是'is',它將不會爲AppDelegate的子類返回true。 – dan
@丹恩,我沒有考慮過比較參考。這也是一個不錯的選擇,可以防止子類。您應該將其作爲答案發布。 – JAL
或'if self == AppDelegate.self'。但只要你不子類AppDelegate,你不需要檢查。 –