2011-12-07 8 views
1

私はまだCocoa/Objective-Cの新機能ですから、私は私の質問を説明できることを願っています。
Xcode 4.2でGarbage Collectedアプリケーションを作成しました。このオブジェクトが作成し、Passwordオブジェクト(my class/xib)を作成するAuthorizeオブジェクト(自分のクラス)を作成するアプリケーションデリゲートを持っています。ココアのガベージコレクションと保持サイクル

パスワードウィンドウは入力を受け付け、承認または拒否して閉じます。そこからAuthorizeオブジェクトが閉じられ、コントロールがアプリケーションデリゲートに戻ります。パスワードnibがモーダルウィンドウとして提示されるとき。

テストとして、各オブジェクトが初期化されるときと終了するときにNSLogステートメントが含まれています。何らかの理由で、私のパスワードオブジェクトがファイナライズされていません。権限オブジェクトが完成しました。

私はAuthorizeオブジェクトを削除し、アプリケーションデリゲートから直接パスワードを作成しました - まだファイナライズしません。

私はこのオブジェクトをファイナライズするために私が考えることができるすべてのものを試しました。(ファイナライズされていない場合、このオブジェクトのメモリを解放していないと仮定しています)
誰かが私が見落としているかもしれない何かを提案することはできますか?

更新:
もっと実験した結果、問題が見つかりました。私は、AppDelegateとWindowController/Nibファイルだけで新しいプロジェクトを作成しました。 GCとビルドで同じ設定を使用して、問題が見つかるまですべてを削除することができました。
パスワード欄にNSSecureTextフィールドがあります。何らかの理由で、これはウィンドウが閉じられたときに解放されませんでした。
ウィンドウを閉じる前に[textField removeFromSuperview]行を追加して、finalizeメソッドが呼び出されました。
これが最善の方法かどうかはわかりませんが、うまくいくようです。

ARCオプションについては、プロジェクトがARCを使用するために10.7以上のターゲットを設定する必要があるという印象を受けました。私は最低10.5を目標にしたいと思っていました。
多分私はそれについて間違っています。私がいるなら、私に知らせてください。

+0

ARCには10.7が必要です。 –

答えて

0

finalizeが呼び出されていない場合でも、まだ強い参照があるか、GCが実行されていません。他のオブジェクトが終了するので、明らかにGCが実行されています。だから、あなたは強い参照を保持している人を探す必要があるでしょう。 Password型の変数を持つすべての人のコードを最初に監査します。それがどこかの辞書や配列に詰まっていないことを確認してください。まだビューコントローラまたはビューが保持していないことを確認してください。

可能であれば、GCではなくARCに切り替えます。これはおそらくまったく同じですが、それ以外のものはずっと優れています。 GCは私たちの多くが無視した興味深い実験でしたが、ARCはプラットフォームがどこに向かうのかは間違いありません。

0

(更新)質問のこの部分について:ARCオプションについては

、私はプロジェクトは、ARCを使用する10.7以上をターゲットにする必要があるだろうという印象の下にありました。私は最低10.5を目標にしたいと思っていました。 多分私はそれについて間違っています。私がいるなら、私に知らせてください。

あなたは、64ビットのSnow Leopardをターゲットにすることができます以降のARCを使用して、しかし、あなたが行う場合は弱参照をゼロに使用することはできません - 代わりにプロパティを割り当てる使用していて、これを移動する場合__unsafe_unretainedとして、明示的に宣言アイバーズをマークルート。 (詳細はthis questionにあります)

関連する問題