0

ParentViewController割り当てChildViewController、コントローラースタックにプッシュして解放します。

ChildViewControllerProductDownloadDelegateProtocolProduct クラスに必要なプロトコルを実装します。

ある時点でChildViewController、 Product オブジェクトを作成し、それ自体を として設定しますdownloadDelegate

ダウンロード中に、 で定義されたメソッドを介してProductクラスが更新されます。ChildViewControllerProductDownloadDelegateProtocol

ユーザーがダウンロード中に の navBar の戻るボタンを押すと、ChildViewController次のダウンロード パーセンテージの更新で.ProductEXC_BAD_ACCESS

がであるかどうかをProductチェックしますが、は割り当て解除されていますが、 として設定されていないため、問題は引き続き発生します。どのポイントに設定するのが最適かわかりません。downloadDelegatenilChildViewController/downloadDelegatenilChildViewControllernil

私のデザインは間違っていますか?

4

2 に答える 2

3

ChildViewControllerのインスタンスを作成し、それProduct自体をデリゲートとして設定する場合は、アンロードしようとしているときにデリゲートとしての自分自身を削除する必要があります。viewDidUnloadそれまたはメソッドのいずれかで、デリゲートをnildeallocに設定する必要があります。Product

残っている場合(たとえば、View Controller を再利用している場合)、メソッドChildViewControllerのデリゲートとしてそれを削除できる可能性があります。viewWillDissappear

この特定の EXC_BAD_ACCESS の問題を修正する別の解決策は、ARC に移行し、Zeroing Weak References を使用することです。 -references-in-objective-c.html )。

それでも、正しい理由で ARC に移行することをお勧めします。直面しているこの特定の問題を修正しないでください。

于 2012-07-20T18:56:33.293 に答える
1

私の経験則は次のとおりです。自分が所有していないオブジェクトのデリゲートになるべきではありません。ここで、「所有する」とは、「強力な参照を保持する」ことを意味します (ARC 用語で)。主な例外は、デリゲートがあなたと UIApplication.delegate を保持する場合です。これは少し奇妙だからです。

通常、次のようにロジックをセッターにバンドルします。

-(void)setProduct:(Product*)p
{
  product.delegate = nil;
  [product release];
  product = [p retain];
  product.delegate = self;
}

-(void)dealloc
{
  self.product = nil;
}

ただし、この設計の根本的な問題は、"製品のダウンロード" が 1 つのデリゲートしか持てないことです。から離れてからChildViewController(の新しいインスタンス) に戻るとどうなるでしょうか? それらは異なるProductインスタンスであり、両方ともダウンロードされていますか?

より良い方法は、ダウンロードを管理し、進行状況の通知に NSNotification/NSNotificationCenter を使用するダウンロード マネージャー シングルトン (シングルトンは嫌いですが) を用意することです。

于 2012-07-20T19:15:11.233 に答える