今週早々に奇妙なバグに遭遇し、問題の根本的な原因を防ぐ方法を確認するためにフォローアップしたかったのです。アイテムをviewDidLoadで安全に初期化することを参照してください。
次のコードを使用してください。だから、someMethod
がTestViewController
前に解雇され
//*****************************
//MAINVIEWCONTROLLER CLASS CODE
//*****************************
//Some event happens that triggers me to want to load up TestViewController.
func showViewController(){
var testController = TestViewController()
testController.someMethod("Test1")
self.navigationController?.pushViewController(testController, animated: true)
}
//*****************************
//TESTVIEWCONTROLLER CLASS CODE
//*****************************
testView:TestView!
override func viewDidLoad(){
super.viewDidLoad()
testView = TestView()
...
}
func someMethod(someData:String){
testView.name = someData //AppCrashes here because testView might be nil.
...
}
は通過とtestView
を作成する機会がありました。 testView
はnilであり、私はそのプロパティにアクセスしているので、オプションの値をアンラップできません。
私が実行しているアプリケーションは6つの異なる場所で動作している可能性がありますが、5/6は問題なく動作していますが、1/6はこのエラーを表示しています。私は、someMethod
が実行される前に、viewDidLoad
が即座に実行されるか、完了することが保証されていないためにその推測を行っていますが、なぜこの6つの使用例すべてでは起こりませんか。
だから、私の主な質問は以下のとおりです。
- なぜこのクラッシュが起こるのでしょうか?
- これを避けるためのベストプラクティスは何ですか?
ありがとう!思いやりのある答えがいつものように票を集めるでしょう!もっと情報が役立つかどうかを教えてください。
あなたはsomeMethod' '呼ぶのですかどこ?条件に応じて 'testView'をアンラップする必要があります。 'viewDidLoad'は、初めてビューコントローラの' view'プロパティが参照されるときに実行されます。 – Paulw11
あなたのコードがどのように遵守されているか不思議です。 testViewはオプションか暗黙的なオプションか? – user1046037
あなたが尋ねていることを示す実際のコードを投稿してください。これはコンパイルされず、さらに重要なことに、あなたの記述にも一致しません。 –