Objective c 我是否应该在私有便利方法中使用weakSelf,当它们被块调用时?

Objective c 我是否应该在私有便利方法中使用weakSelf,当它们被块调用时?,objective-c,objective-c-blocks,Objective C,Objective C Blocks,标题几乎涵盖了它。我理解为什么在块内使用weakSelf 但是想象一下我们有一个视图控制器的情况。视图控制器调用具有完成块的数据API(单例共享实例)。因此,在这个调用中,VC提供了一个完成块,VC不持有对它的引用。 VC中还有一个私有的便利方法,它对UI组件做一些事情并调用self。 但是这个私有便利方法是在块内部调用的 所以知道了这一点,我也应该在便利方法中使用weakSelf吗 任何地方都可以使用weakSelf模式: 否则,您将有一个强大的参考周期 您正在使用可取消的异步任务,并希望在

标题几乎涵盖了它。我理解为什么在块内使用weakSelf

但是想象一下我们有一个视图控制器的情况。视图控制器调用具有完成块的数据API(单例共享实例)。因此,在这个调用中,VC提供了一个完成块,VC不持有对它的引用。 VC中还有一个私有的便利方法,它对UI组件做一些事情并调用self。 但是这个私有便利方法是在块内部调用的


所以知道了这一点,我也应该在便利方法中使用weakSelf吗

任何地方都可以使用
weakSelf
模式:

  • 否则,您将有一个强大的参考周期

  • 您正在使用可取消的异步任务,并希望在
    dealloc
    中取消它们;或

  • 如果在异步调用仍在进行时关闭视图控制器,则不希望在异步调用期间保留它


后一点意味着可以将
weakSelf
模式与异步方法的完成块结合使用,而不管是否存在强引用循环。问题很简单,即使视图控制器已被解除,您是否需要在异步调用期间保留视图控制器。

如果我理解正确,您不会将块存储到
self
的属性中(或存储到引用
self
的对象中,等等)。因此根本没有理由使用
weakSelf
,因为无法构建保留循环。

关键点:self是否对完成块具有强引用。如果没有,就不需要懦夫。如果不确定是否执行
deallocate
方法并查看它是否被调用。在大多数情况下,临时保留周期是可以的。@Andy实际上,可以手动中断保留周期。这是一个选项。好吧,据我所知,没有一个明确的答案,这取决于对应用程序状态的期望。在我的特殊情况下,如果VC被解雇,那么尝试设置UI组件是没有意义的。换言之,VC将使此UI组件更新无效。所以我会和懦夫一起去?我个人会的。此外,如果异步任务的存在仅仅是为了更新UI组件,我总是会问自己,将其设置为可取消操作是否有意义。如果是琐碎的事情,可能不值得。但是如果它的计算成本很高(例如复杂的图像处理、缓慢或复杂的网络请求等),我会使用
weakSelf
并在
dealoc
中取消它。