1

ブロック内で自分自身を強く参照することによって、メモリのバグが発生することが最終的にわかりました。しかし、同様のケースでなぜ弱いものが必要ないのかわかりません。

画像キャプチャ タスクを実行する CameraCaptureManager クラスがあり、CameraViewController にはこのマネージャーの強力なプロパティがあります。マネージャーには、コントローラーを指す弱いデリゲート プロパティがあります。

これは、マネージャーで weakSelf を使用する必要がある場所です。そうしないと、-(void)dealloc が呼び出されません。

    // in CameraCaptureManager
    __weak CameraCaptureManager *weakSelf = self;
    void (^deviceOrientationDidChangeBlock)(NSNotification *) = ^(NSNotification *notification) {
        UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
        [weakSelf updateVideoOrientation:deviceOrientation];
    };
    self.deviceOrientationDidChangeObserver = [notificationCenter addObserverForName:UIDeviceOrientationDidChangeNotification
                                                                              object:nil
                                                                               queue:nil
                                                                          usingBlock:deviceOrientationDidChangeBlock];  

マネージャーは deviceOrientationDidChangeObserver を強力に保持するため、メモリ保持サイクルを中断するには、weakSelf が必要です。それは結構です、私はそれを手に入れました...しかし、同じクラスの同様のケースでweakSelfを使用していないことがわかりました:

[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:captureConnection
                                                   completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error){

                                                       UIImage *image = nil;

                                                       if (imageDataSampleBuffer != NULL) {
                                                           NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 
                                                           image = [[UIImage alloc] initWithData:imageData];
                                                       } 

                                                       if ([self.delegate respondsToSelector:@selector(captureManager:capturedStillImage:)]) {
                                                           [self.delegate captureManager:weakSelf capturedStillImage:image];
                                                       }
                                                   }]; 

マネージャーも stillImageOutput を強力に保持していますが、なぜ完了ブロックで強力な「自己」を使用できるのでしょうか? マネージャー オブジェクトは、ブロック内でこの強力な自己との割り当てを解除します。私は混乱しています、いくつかの光を当ててください。

また、保持サイクルが発生しない場合でも、2番目のケースでweakSelfを使用する必要がありますか?

4

1 に答える 1

4

2 番目のコード例では、一時的な保持サイクルがあります。completionHandlerブロックが呼び出されると、ブロックが解放され、それと共に Capture が解放されるためself、解放サイクルが中断されます。

于 2013-07-28T17:51:18.560 に答える