“__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
如果我们传递 self,它可能会在某些情况下导致循环保留(例如,某些对象可能对块具有强引用,而 self 可能对该对象具有强引用)。将弱引用传递到块中可确保不存在此类保留循环。但是我们仍然可能需要在执行块时保持自我存活。这就是为什么我们将弱引用分配给强引用。
结论:将弱引用传递给块并将其分配给强引用会在块执行时保留对象,同时保证不会进行循环引用
weakSelf
的目的是确保通知中心观察者不维护对AVCamViewController
的强引用。 strongSelf
在块内的存在是为了避免 AVCamViewController
可能在通知中间被释放的竞争条件(因此,如果 weakSelf
在通知进入时存在,请将其保留处理通知的持续时间;但是如果通知进来时 weakSelf
不存在,那么 strongSelf
也将是 nil
。
这个过程(有时戏称"weak self-strong self dance")很关键。如果你只有 strongSelf = self
,你就重新引入了强引用循环(以前称为 "retain cycle"),上述模式很难解决。
我正在尝试学习 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
如果我们传递 self,它可能会在某些情况下导致循环保留(例如,某些对象可能对块具有强引用,而 self 可能对该对象具有强引用)。将弱引用传递到块中可确保不存在此类保留循环。但是我们仍然可能需要在执行块时保持自我存活。这就是为什么我们将弱引用分配给强引用。
结论:将弱引用传递给块并将其分配给强引用会在块执行时保留对象,同时保证不会进行循环引用
weakSelf
的目的是确保通知中心观察者不维护对AVCamViewController
的强引用。 strongSelf
在块内的存在是为了避免 AVCamViewController
可能在通知中间被释放的竞争条件(因此,如果 weakSelf
在通知进入时存在,请将其保留处理通知的持续时间;但是如果通知进来时 weakSelf
不存在,那么 strongSelf
也将是 nil
。
这个过程(有时戏称"weak self-strong self dance")很关键。如果你只有 strongSelf = self
,你就重新引入了强引用循环(以前称为 "retain cycle"),上述模式很难解决。