2016-11-24 4 views
5

アップルのドキュメントinitialize()によると、最初のメッセージを受け取る前にクラスを初期化します。リリースビルドコンフィグレーションでNSObjectのinitialize()が呼び出されない

リリースビルド設定でinitialize()が動作しない理由を誰かが説明できますか?例えば

class Test: NSObject { 
    override class func initialize() { 
     print("initialize") 
    } 
    class func test() { 
     print("test") 
    } 
} 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     Test.test() 
    } 
} 

デバッグ構成での出力:

initialize 
test 

リリース構成での出力:

test 

答えて

3

私は簡単なテストを行なったし、それがRelease構成のように見えます+ initializeは、tのインスタンスを作成しないかぎり呼び出されません彼はクラスです。しかし、Debugでは、クラスメソッドを呼び出すだけで+initializeをトリガすることができます。文書化されていない警告のように見えます。

編集: さらに興味深い事実は、クラスのメソッドを呼び出し、両方DebugRelease構成でのObjective-Cのプロジェクトのために+ initializeを誘発するのに十分であるということです。私はこれがバグだと言います。あなたはレーダーをファイルしたいかもしれません。

+0

回答ありがとうございます。作成されたバグレポートhttps://openradar.appspot.com/29389821 –

+0

特定の設定はSwiftコンパイラ - コード生成/最適化レベルのようです。 'なし[-Onone]と'高速、単一ファイルの最適化[-O] ' – DDP

関連する問題