“__weak MyClass *myWeakClass = self” 使用 myWeakClass VS 使用 self

"__weak MyClass *myWeakClass = self" using myWeakClass VS using self

我正在尝试学习 AVFoundation 示例代码 "AVCam"。在示例代码项目中,AVCamViewController.m class,有一个类似

的实现
__weak AVCamViewController *weakSelf = self;
[self setRuntimeErrorHandlingObserver:[[NSNotificationCenter defaultCenter] addObserverForName:AVCaptureSessionRuntimeErrorNotification
                                                                                            object:[self session]
                                                                                             queue:nil
                                                                                        usingBlock:^(NSNotification *note) {
AVCamViewController *strongSelf = weakSelf;

我的问题是为什么我们要先声明一个__weak指针,然后再将这个弱指针赋值给*strongSelf。如果我们直接分配 "self"
会有什么区别 类似于:

AVCamViewController *strongSelf = self

完整代码 https://developer.apple.com/library/prerelease/ios/samplecode/AVCam/Listings/AVCam_AVCamViewController_m.html

如果我们传递 self,它可能会在某些情况下导致循环保留(例如,某些对象可能对块具有强引用,而 self 可能对该对象具有强引用)。将弱引用传递到块中可确保不存在此类保留循环。但是我们仍然可能需要在执行块时保持自我存活。这就是为什么我们将弱引用分配给强引用。

结论:将弱引用传递给块并将其分配给强引用会在块执行时保留对象,同时保证不会进行循环引用

weakSelf的目的是确保通知中心观察者不维护对AVCamViewController的强引用。 strongSelf 在块内的存在是为了避免 AVCamViewController 可能在通知中间被释放的竞争条件(因此,如果 weakSelf 在通知进入时存在,请将其保留处理通知的持续时间;但是如果通知进来时 weakSelf 不存在,那么 strongSelf 也将是 nil

这个过程(有时戏称"weak self-strong self dance")很关键。如果你只有 strongSelf = self,你就重新引入了强引用循环(以前称为 "retain cycle"),上述模式很难解决。