0

ARCを使用していないxcode..imでコントローラーをリリースするのに助けが必要です..メインのデリゲートコントローラーからのこの単純なコードを見てください:

LoginViewController *login = [[LoginViewController alloc] init];
[window addSubview:login.view];
[window makeKeyAndVisible];
[login release];  // code runs if i comment out this line

最後の行をコメントアウトすると、プログラムが実行されます。プログラムは最後の行でクラッシュします...私はゾンビを入れました、そしてここに結果があります:2012-08-17 09:43:02.193ダイヤラ[238:707] * -[LoginViewController PerformSelector:withObject:withObject:]:メッセージ割り当て解除されたインスタンス0x186360に送信されます

どうすればこれを追跡できますか。また、割り当てと解放をすぐに行ってから、なぜこれが起こっているのでしょうか。保持などと関係がありますか

4

1 に答える 1

1

ログインコントローラはサブビューとして追加されてから解放されますが、addSubviewメソッドはコントローラを保持しないため(controller.viewのみ)、それ以上使用することはできません。

それを解放する必要があります。そうしないとリークが発生します。解決策は、クラスにproperty / ivarを作成し、(ローカル変数ではなく)View Controllerを割り当ててから、deallocで解放することです。

あなたが見逃している点は、[login release]ステートメントがloginViewControllerの保持カウントを効果的にゼロに減らし、オブジェクトが失われる/クリーンアップされることです。これは、サブビューが表示されます。

したがって、親オブジェクト(メインコントローラー、例を正しく理解している場合)は、loginControllerを作成し、loginViewをサブビューとして追加し(これは、addSubview呼び出しを実行することで保持されます)、コントローラーを解放しますが、ログインビュー!したがって、解決策は、必要な限り(loginViewを削除するか、メインコントローラーの割り当てが解除されるまで)メインコントローラーに参照を保持することです。

于 2012-08-17T13:57:49.280 に答える