Objective c 我是否应该在私有便利方法中使用weakSelf,当它们被块调用时?
标题几乎涵盖了它。我理解为什么在块内使用weakSelf 但是想象一下我们有一个视图控制器的情况。视图控制器调用具有完成块的数据API(单例共享实例)。因此,在这个调用中,VC提供了一个完成块,VC不持有对它的引用。 VC中还有一个私有的便利方法,它对UI组件做一些事情并调用self。 但是这个私有便利方法是在块内部调用的Objective c 我是否应该在私有便利方法中使用weakSelf,当它们被块调用时?,objective-c,objective-c-blocks,Objective C,Objective C Blocks,标题几乎涵盖了它。我理解为什么在块内使用weakSelf 但是想象一下我们有一个视图控制器的情况。视图控制器调用具有完成块的数据API(单例共享实例)。因此,在这个调用中,VC提供了一个完成块,VC不持有对它的引用。 VC中还有一个私有的便利方法,它对UI组件做一些事情并调用self。 但是这个私有便利方法是在块内部调用的 所以知道了这一点,我也应该在便利方法中使用weakSelf吗 任何地方都可以使用weakSelf模式: 否则,您将有一个强大的参考周期 您正在使用可取消的异步任务,并希望在
所以知道了这一点,我也应该在便利方法中使用weakSelf吗 任何地方都可以使用
weakSelf
模式:
- 否则,您将有一个强大的参考周期
- 您正在使用可取消的异步任务,并希望在
中取消它们;或dealloc
- 如果在异步调用仍在进行时关闭视图控制器,则不希望在异步调用期间保留它
后一点意味着可以将
weakSelf
模式与异步方法的完成块结合使用,而不管是否存在强引用循环。问题很简单,即使视图控制器已被解除,您是否需要在异步调用期间保留视图控制器。如果我理解正确,您不会将块存储到self
的属性中(或存储到引用self
的对象中,等等)。因此根本没有理由使用weakSelf
,因为无法构建保留循环。关键点:self是否对完成块具有强引用。如果没有,就不需要懦夫。如果不确定是否执行deallocate
方法并查看它是否被调用。在大多数情况下,临时保留周期是可以的。@Andy实际上,可以手动中断保留周期。这是一个选项。好吧,据我所知,没有一个明确的答案,这取决于对应用程序状态的期望。在我的特殊情况下,如果VC被解雇,那么尝试设置UI组件是没有意义的。换言之,VC将使此UI组件更新无效。所以我会和懦夫一起去?我个人会的。此外,如果异步任务的存在仅仅是为了更新UI组件,我总是会问自己,将其设置为可取消操作是否有意义。如果是琐碎的事情,可能不值得。但是如果它的计算成本很高(例如复杂的图像处理、缓慢或复杂的网络请求等),我会使用weakSelf
并在dealoc
中取消它。