■現状の問題点:
実機で写真を2枚撮るとアプリが落ちる
■現状:
写真を撮ったら、その写真を縮小表示してコメントをつけられるダイアログウインドウ的なものをサブウインドウとして表示している。
■問題点:
当然、初回表示時は、viewの初期化処理が走るが、写真を2枚撮った後に、再度、viewの初期化処理が走っていて、その初期化処理終了時に、カーネル保護違反みたいなエラーが出て落ちている模様。
単純に「そのウインドウを開く/閉じる」というボタン(が別にある)では、viewDidLoadは走らない。
■初期化手順:
viewDidLoadイベントの中で、viewの初期化処理が走っている。
その初期化処理が二度走るとエラー???でも、そこを二回実行しないようにしてもうまく動かないので、初期化内部の処理に地雷がある?
■TODO:
1.二度目のviewDidLoadはどういうタイミング、理由で実行されるのか?を調べる。
2.一度目の実行はOKなのに、二度目で落ちているなら、二度目の実行で支障のあるコードになっているわけだから、そこの不整合点を調べる。
(やっぱり、autoreleaseあたりなのかなー)
3.その他
・そもそもviewDidLoadでviewの初期化をしてよいのか?
・ダイアログウインドウを閉じる処理の方で開放しておくべきメモリはないのか?
・むしろ必ずviewDidLoadが走るような毎回初期化するような状態にした方が良いのか?
・そもそもそういう方法で別窓を実装して良いの?(addSubview、removeSubView?あたり。夏ライオンの書き込み窓を参考に。)
ここが解決できたら、ほぼほぼアップできる見通し。
全く同じ現象かはわかりませんが、似たようなことがあり
軽く調べて根本的な原因はよくわかりませんでしたが
簡単に言うと、viewが作り直されている感じです。
(viewのアドレスが変わっていたので、たぶん)
なので、viewがそのままで存続していることを期待して
変数とかオブジェクトとか参照していると、落ちる原因になります。
なんの裏付けも無い超直感ですが、このviewが再構築される現象は
残メモリの状態で変わってくると思います。
自分の場合、具多的に発生したフローは
1. ボタン押下でviewCtrlからUIImagePickerViewを表示
2.写真取り終わったコールバックで親に戻す
3.UIImagePickerView release
4.親にもどる ← ここらへん
また、UIImagePickerView以外でも画面遷移の際に
(NavigationCtrlのpop/pushとかでも)発生しました。
で、自分の場合は、処理フローを見直して
viewが再構築されても問題ないようにして回避しました。
ただ、これが正解かどうかは正直わかりません。。。
というかむしろ自信ありませんが。。。
って、これも何も試していない超直感ですが。
UIViewControllerサブクラスはディフォルトは、メモリ不足のイベントを取得すると、自分のviewがsuperViewを持っていない場合、viewを開放するという凶悪仕様になっているのですね。
なのでメモリが足りないと、ビューが開放され、またビューを参照する瞬間にビューが生成され・・・ といった具合にビューが多重生成されるわけです。
打開策としてはメモリ不足の警告を無視するのが1つ、もう1つはビューが完成したときに行った処理は全部、ビューが強制開放されるときにreleaseされるようにすることです。
ここら辺をやっとかないと、無限メモリ不足や、nilによるBADAccessで死んじゃいます。
viewの再構築イベントをどうハンドリングするかがいま悩み中です〜
>fladdictさん
半分勘でやってたことだったので(おぃ、とても参考になりました。
ありがとうございます。
場所借りてしまってすみません。m(_ _)m >f-shinさん
元ウインドウの参照までごっそり消えていたので初期化の仕方そのものを変えて行かなくてはいけないのは参りました。