3

割り当てられて初期化されたインスタンス変数 MyObject があるとします。次に、私がこれを行うと言います:

[backgroundThread performBlock:^{
    //do something with MyObject that might take some time
}];

[self dismissModalViewController]; //this releases all instance variables, right?

何が起こるかというと、バックグラウンドでオブジェクトに対して何らかの作業を行うNSManagedObjectContext呼び出しがあります。backgroundThreadこれはすぐに戻り、バックグラウンドで作業を行ってからdismissModalViewController呼び出され、すべてのインスタンス変数の割り当てを解除します。では、モーダル ビューが閉じられたがbackgroundThread、オブジェクトを使用する必要がある場合はどうなるでしょうか。これは問題ですか?回避策は何ですか?

もう 1 つ: この MyObject は管理オブジェクト コンテキスト backgroundThread に挿入されます。これは、ビューを閉じた後でも、この NSManagedObjectContext がオブジェクトを保持することを意味しますか?

ARCを使用しています。

4

2 に答える 2

5

ここで考えなければならないことがいくつかあります。最初に、ブロックが参照するものは何でもキャプチャすることに注意してください。したがって、ブロックで何をしているかに応じて、特別なことをする必要はなく、コードは正常に機能します。ブロック キャプチャのルールは、Apple のブロック プログラミング トピックのドキュメントに記載されており、各変数の処理方法はその型によって異なります。特に、

手動で参照カウントされる環境では、ブロック内で使用されるローカル変数は、ブロックがコピーされるときに保持されます。ブロック内でインスタンス変数を使用すると、オブジェクト自体が保持されます。特定のオブジェクト変数に対してこの動作をオーバーライドする場合は、__block ストレージ タイプ修飾子でマークできます。

ARC を使用している場合、ブロックがコピーされて後で解放されると、オブジェクト変数は自動的に保持および解放されます。

考慮すべきもう 1 つの点は、インスタンス変数へのアクセスがスレッド セーフである場合とそうでない場合があることです。as として宣言されたプロパティを介してインスタンス変数にアクセスすることatomicは正しい方向への一歩ですが、状況の詳細に応じて、ミューテックス ロックまたはその他の手法を使用してアクセスを同期する必要がある場合があります。

于 2012-06-30T20:57:03.547 に答える
1

(モーダル) ビュー コントローラーの ivar またはその他のプロパティを参照する場合は、モーダル ビュー コントローラーがまだ存在していることを確認する必要があります。

に関する Apple のドキュメントdismissModalViewControllerAnimated:からの潜在的に役立つヒントを次に示します。

レシーバーに提示されたビュー コントローラーへの参照を保持する場合は、このメソッドを呼び出す前に modalViewController プロパティの値を取得します。

うまくいくかもしれない別のアイデアは、View Controllerまたは他のスレッドからアクセスしたいデータ/オブジェクトをカプセル化する別のオブジェクトを作成してインスタンス化することです。

于 2012-06-30T20:39:43.863 に答える