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

时间:2015-03-06 13:44:42

标签: ios objective-c self weak-references

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

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

我的问题是为什么我们要首先声明__weak指针,然后将此弱指针指定给* strongSelf。如果我们直接分配“自我”,那会有什么不同 类似的东西:

AVCamViewController *strongSelf = self

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

2 个答案:

答案 0 :(得分:1)

如果我们传递self,它可能会在某些条件下导致保留周期(例如,某些对象可能具有对该块的强引用,并且self可能具有对该对象的强引用)。将弱引用传递到块中可确保不存在这样的保留周期。但是我们仍然可能需要在块执行时保持自己的活力。这就是为什么我们将弱引用赋予强引用的原因。

结论:将弱引用传递给一个块并将其赋予一个强引用会在块执行时保留对象,同时保证不会保留一个保留周期

答案 1 :(得分:1)

weakSelf的目的是确保通知中心观察员不会对AVCamViewController保持强烈的引用。块内strongSelf的存在是为了避免在通知中间AVCamViewController可能被解除分配的竞争条件(因此当通知进入时{1}}存在,请保留它处理通知的持续时间;但如果通知进入时weakSelf不存在,那么weakSelf也会strongSelf

这个过程(有时候开玩笑称为弱自我强烈的自我舞蹈")是至关重要的。如果你只有nil,那么你已经重新引入了强大的参考周期(之前称为"保留周期"),上述模式很难解决。