ブロック内で自分自身を強く参照することによって、メモリのバグが発生することが最終的にわかりました。しかし、同様のケースでなぜ弱いものが必要ないのかわかりません。
画像キャプチャ タスクを実行する 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を使用する必要がありますか?