我终于找到了我的记忆错误是由块强烈指自我造成的。 但我不知道为什么在类似的情况下,不需要弱:
我有一个CameraCaptureManager类做图像采集任务,以及CameraViewController有这个经理的强烈财产。 经理具有弱委托财产指回控制器。
这是我必须在管理使用weakSelf,否则 - (空)的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强烈,但为什么我可以在完成块的使用强大的“自我”? 经理对象获得的dealloc与块内这种强烈的自我。 我很困惑,请一些启发。
还做我需要使用weakSelf在第二种情况,即使它不会造成任何的保留周期?