2011-01-12 31 views
2

私は、私のアプリケーションでUITableViewを表示するビューを持っています。このビューはnibファイルで作成され、カスタムビューコントローラを備えています。このビューのUIViewControllerサブクラスは、UITableViewのデータソースとデリゲートとして機能します。UIViewController -deallocモーダルビューコントローラを終了した後に呼び出される

私のUITableViewは、自分のデータに基づいていくつかの行を表示します。次に、最後の行に異なるテキストが表示されます: "別のものを追加..."。最後の行が選択されている場合は、(ユーザーがデータを追加できるように)モーダル・ビュー・コントローラーを提示します。モーダルビューコントローラを閉じると、元のビューが(期待どおり)再び表示され、すべてが正常に表示されます。しかし、私はこのビューと対話しようとすると、アプリケーションがクラッシュします。

いくつかのNSLog()ステートメントをUIViewController(UITableView用)に配置することから、モーダルビューが終了した直後に-deallocメソッドが呼び出されていると判断しました。これは、私がそのビューで何かをしようとすると、クラッシュを説明します。しかし、私はなぜこのビューコントローラで-deallocが呼び出されているのか分かりません。モーダルビューコントローラを閉じ

、私が持っている:モーダルビューコントローラののUIViewControllerでIBActionメソッドのコードとして

[self dismissModalViewController:YES]; 

を。このアクションは、対応するnibファイルの取り消しボタンに関連付けられています。

さらに、View Controller Programming Guideからの私の理解は、それ自身の中からモーダルコントローラを却下しても問題ありませんが、デリゲートを使用する方がより堅牢です。私は当初デリゲートを使用していましたが、デバッグを簡略化するためにデリゲートを取り出しました。私はデリゲートを再度チェックするようにしています。デリゲートを使うときも同じ動作が起こります。親ビューコントローラでのデリゲートの実装がある

[[self delegate] myModalViewController:self didAddObject:obj]; 

[self dismissModalViewController:YES] 

誰もが前にこれを見たか起こったりすることができるものの任意の提案を持っている場合は、モーダルコントローラのアクションメソッドは、として実装されている呼び出しこれをデバッグする方法は、私は非常に感謝します。

+0

親ビューコントローラが割り当て解除されていることを意味しますか? – BoltClock

+0

はい、そうです。 – jmac

答えて

6

-deallocが呼び出されている場合は、何かがView Controllerを解放しています。あなたのビューコントローラで-releaseを実装してみてください。

-(void)release { 
    NSLog(@"view controller released"); 
    [super release]; 
} 

この予想外の解放メッセージが発生したときにコールスタックを検査するためにデバッガを使用できるようにします。

+1

ありがとう!モーダルビューコントローラのdeallocメソッドでは、[delegate release]と呼ばれました。自分自身の後に良いとクリーンアップするつもりです。私はそれが実際に親ビューコントローラを解放するという事実については考えなかった。私はあなたの提案なしにこれを見つけられませんでした。ありがとうございました! – jmac

+2

ARCの代わりに何を使用できますか? – yatanadam

3

他の場所に保持していない場合、モーダルビューコントローラ自体からdismissModalViewController(メッセージは親ビューコントローラに転送されます)と呼ぶのは危険です。通常、親ビューコントローラは、それが提示したモーダルビューコントローラを破棄する責任があります。

+0

これに対処するためにオリジナルの投稿を更新しました。 – jmac

+0

これは非常に重要であり、見つけにくいです! – eliocs

関連する問題