0
[NSURLConnection sendAsynchronousRequest:req queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        if(data != nil && self.superview != nil) { // <-- EXC_BAD_ACCESS on this line
            [self.musicItemImg setAlpha:0.0];
            [self.musicItemImg setImage:[UIImage imageWithData:data]];
            [UIView animateWithDuration:0.25 animations:^{
                [self.musicItemImg setAlpha:1.0];
            }];
        }
    });
}];

非同期ロードが完了する前にこのビューが削除されることがあります。使用しようとするselfEXC_BAD_ACCESS、当然のことながら削除されます。非同期接続を中止できますか? または、これに対抗するより良い方法はありますか?

4

1 に答える 1

2

まず第一に、UIViewサブクラスでURLリクエストを開始するのは非常に悪いスタイルです。ビューコントローラでそれを行う必要があります!

NSOperationQueueは、ViewControllerのクラスインスタンスである必要があります。また、完了ハンドラーで構成する必要のあるビューは、クラスインスタンス(プロパティ)である必要があります。すべてのリクエストに同じ操作キューを使用します。viewWillDisappearでは、次の方法ですべてのリクエスト操作をキャンセルできます。

[self.operationQueue cancelAllOperations];
于 2012-06-18T21:57:18.297 に答える