2012-01-12 10 views
1

まず、私はARCを使用していると言わなければならないので、retainはオプションではありません。オブジェクトのクラスはNSViewController型で、2つのNSTimerといくつかのテキストフィールドとボタンがあります。奇妙なことは、2つのタイマーが無効にされると、オブジェクトが解放されているように見えるということです。これは問題になることがあります。一時停止または再開する必要がある場合があります。つまり、無効化する必要があるため、参照が失われ、オブジェクトへのメッセージがEXC BAD ACCESSをスローします。Cocoa:オブジェクトが自動リースされていないときに取得する

メモリ管理やARCにはあまり慣れていませんが、タイマーによっては参照が失われるのはなぜですか?つまり、無効になったからといって、私はもうオブジェクトが必要ないわけではありません。

私はタイマーをインスタンス変数とプロパティとして宣言しようとしましたが、何も変わりませんでした。

私が本当に必要とするのは、両方のタイマが無効になっている場合でも、参照を保持しないことです。私は間違って何をしていますか?

答えて

2

NSTimerは対象を保持しているため、オブジェクトへの唯一の参照であれば、タイマが無効になったときに割り当てが解除されます。あなたは、好ましくは宣言された強い財産とすることによって、あなたのオブジェクトの所有権を取らなければならないでしょう。

編集:「委任」を「対象」に変更しました。

はい、プロパティと(場合によっては)インスタンス変数を宣言する必要があります。 release notesには良い例がありますが、他にも良いイントロがいくつかあります。所有者クラスの割り当てが解除された場合は、タイマーを無効にしてください。そうしないと、ビューコントローラがハングアップします。

+0

"デリゲート"ではなく "ターゲット"を意味します。 –

+0

これは有望だと思います。だから私の他のクラス(このオブジェクトを作成するもの)は、このオブジェクトのヘッダファイル内に宣言する必要がありますか?そして、私はそれを強固な財産にするためにどのような譲渡をすべきですか? – Elbimio

+0

@Francis McGrew私はまだ問題があります。クラスを(非原子的で強力な)プロパティとして宣言しました。問題はクラスのいくつかのインスタンスが必要なことです。私が2番目のインスタンスを作成すると、前の1つでNSTimerを再起動すると、不正アクセスがスローされます。私は最初のものか何かを上書きしているが、それは独立しているはずであると想像する。 – Elbimio

関連する問題