2

サーバーから画像をダウンロードしてビューに表示するアプリケーションを実行しています。そのためにデリゲートを使用しています。画像の読み込みが完了すると、デリゲートはメッセージをビューに送信して画像を表示します。

上記のシナリオは正常に機能しています。しかし、その特定のビューから他のビューに移動すると、画像の読み込みが完了すると、デリゲートはメッセージを送信しようとし、エラーが発生します。

を設定してみました

imageFetcher.delegate=nil;

ビューでdidUnload。また、ダウンロード クラスでデリゲート メソッドを呼び出す前に、デリゲートが nil であることを確認します。

しかし、デリゲート オブジェクトが nil ではないことがわかります。

if(delegate!=nil)
{
  [delegate imagefetcherView:self didLoadImage:image];
}

このエラーを修正するにはどうすればよいですか?

ありがとう

4

4 に答える 4

7

viewDidUnloadクリーンアップを行うことに依存しないでください。これは、iOS 6 より前のバージョンの iOS でのみ呼び出され、メモリ不足のためにビューがアンロードされた場合にのみ呼び出されます (ただし、ビューを閉じたりポップしたりする場合はそうではありません)。

メソッドまたはまたは適切な場所nilでデリゲートを設定します。deallocviewDidDisappear

nilどの方法を使用するかを選択する際の2 つの注意点delegate:

  1. 現在のView Controllerがまだ閉じられていなくても、別のView Controllerをプッシュ/提示すると、 viewWillDisappearandも呼び出されることに注意してください。viewDidDisappear問題のView Controllerが別のView Controllerをプッシュ/提示しない場合にのみ、これらの非表示関連のメソッドに依存してください。

  2. この手法を使用する場合、 がイメージ フェッチャー クラスのプロパティであるdealloc場合にのみ機能することに注意してください(通常、デリゲートは である必要があります)。がorプロパティの場合、View Controllerが呼び出されるのを防ぎます。delegateweakweakdelegatestrongretaindealloc

ところで、View Controller が閉じられていても、画像のフェッチを続行させているようです。デリゲートだけnilでなく、リクエストもキャンセルしたい場合があります。それは、(a) キャンセルを許可するフェッチ (NSURLConnectionDataDelegateアプローチや AFNetworking 操作など) を使用しているかどうか、および使用している場合は (b) キャンセルするかどうかによって異なります。ただし、貴重なネットワーク リソース (特に低速のセルラー接続の場合) を拘束するのは簡単で、ユーザーがそれを必要としなくなった場合でも、要求を続行できます。アプリの詳細によって異なります。

とにかく、に依存しないでくださいviewDidUnload

于 2013-10-10T16:35:12.950 に答える
3

viewDidUnloadiOS 6 以降では呼び出されません。

あなたはこれを使うべきです

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
     imageFetcher.delegate=nil;
}
于 2013-10-10T16:34:56.527 に答える
0

クラスで dealloc 呼び出しを行うことはできますが、[super dealloc] を呼び出すべきではありません。追加すると、ここにブレークポイントを設定して、保持カウントが 0 になる場所を確認できます。または、Instruments を使用してコントローラーの保持/解放サイクルを追跡します。

于 2013-10-10T19:55:37.993 に答える
0

ビューコントローラーの割り当てが解除されたときに画像を一時的に保存するために別のキャッシュを実装しますが、ユーザーが同じページに戻った場合など、画像をもう一度使用できます。

その場合、有効期間の長いキャッシュ オブジェクトをdelegate. たとえば、View Controller は、これらの View Controller が表示されるようになったときに受信画像に関するキー値通知を受信するようにサブスクライブできます (ただし、 で KVO のサブスクライブを解除することを忘れないでくださいviewWillDisappear)。

コントローラーが非表示であるが、再度表示される可能性が高い場合は、画像がキャッシュに保存されます (メモリが不足している場合は削除されます)。もちろん、写真が二度と表示されない場合はキャッシュをチェックして、写真を削除することもできます。

于 2013-10-10T21:01:41.437 に答える