OBJ-C弱自我的块:为什么第二一个不需要自己弱在两个类似的案件中(obj-c weak self

2019-10-18 10:35发布

我终于找到了我的记忆错误是由块强烈指自我造成的。 但我不知道为什么在类似的情况下,不需要弱:

我有一个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在第二种情况,即使它不会造成任何的保留周期?

Answer 1:

在你的第二个代码示例,你有一个暂时的保留周期。 当completionHandler块被调用,该块被释放,并用它捕获的self ,使发布周期被打破。



文章来源: obj-c weak self in a block: why the 2nd one doesn't need a weak self inside in two similar cases