1

NSObjectのサブクラスへの強い参照を持つ複数のビューコントローラがあります。各ViewControllerを使用すると、ユーザーはこのオブジェクトを何らかの方法で変更してから、オブジェクトを次のViewControllerに渡すことができます。完了すると、ユーザーはこれらの変更をコミットし、NSObjectサブクラスの新しいインスタンスでプロセスを最初からやり直すことができます。私が経験している問題は、スタック上の一部のビューコントローラーがコミットされたインスタンスへの参照を保持していることです。

弱くてunsafe_unretainedを使用しようとしましたが、ビューコントローラー間でオブジェクトを渡すのが難しくなります。

基本的に、コミットされたオブジェクトのインスタンスの割り当てを解除する必要があります。これにより、ViewControllerによるオブジェクトへの参照がゼロになります。ただし、ARCではdeallocへの明示的な呼び出しは許可されていません。

NSNotificationCenterまたはデリゲートを使用してこれを解決できますが、これを行うためのよりクリーンな方法はありますか?

任意の洞察をいただければ幸いです。ありがとう!

4

4 に答える 4

3

retain作業中は、各View Controllerにオブジェクトを持たせるのが合理的です。

ビュー コントローラ A がオブジェクトを操作している間、オブジェクトは保持されます。それが終了してそれを B に渡すと、B はそれを保持し、A はそれへの自身の参照を nil に設定して所有権を放棄します。このプロセスは、最終的なビュー コントローラーがオブジェクトをコミットするまで続きます。次に、オブジェクトへの独自の参照を nil に設定します。これにより、オブジェクトの割り当てが解除されます。

于 2013-03-20T21:14:01.177 に答える
2

モデル オブジェクト (全員が変更するオブジェクト) は、中央の「モデル」クラスが所有する必要があります。あなたはそれを渡すことができます。などのメソッドを持つことができますcurrentRecord。そうすれば、すべてのView Controllerが現在のレコードへの弱い参照を持つことができます。または、必要なたびにModelに問い合わせることもできます。View Controller はデータ オブジェクトを「所有」してはなりません。

これは、View Controller が KVO を使用してcurrentRecord変更を監視できることを意味します。代わりに、物事が変化したときに通知を提供できるオブジェクトを提供します。モデル オブジェクトは、潜在的にネットワークまたはディスク アクセスを処理することもできます (別の方法として、モデルを利用してネットワークまたはディスク アクセスを提供する別のコントローラーを用意することもできます)。ここで重要なのは MVC です。モデル クラスをビュー クラスとコントローラー クラスから分離したいと考えています。

于 2013-03-20T21:13:46.307 に答える
1

コミットしたら、オブジェクトを に設定するだけですnil。ARC は自動的に解放します。

于 2013-03-20T21:11:24.030 に答える
0

ビューコントローラーで dealloc メソッドをオーバーライドし、そこでオブジェクトを nil に設定できます。そのため、View Controller のインスタンスがスコープ外になると、dealloc が呼び出され、オブジェクトが nil に設定されます。[super dealloc] を呼び出さないでください。

于 2013-03-20T21:11:57.777 に答える