当它们被块调用时,我应该在私有便利方法中使用 weakSelf 吗?
Should I use weakSelf in private convenience methods when they are called by block?
标题几乎涵盖了它。我明白为什么要在块中使用 weakSelf。
但是想象一下我们有一个视图控制器的情况。视图控制器调用具有完成块的数据 API(单例共享实例)。所以在这个调用中 VC 提供了一个 VC 没有引用的完成块。
VC 中还有一个私有的便捷方法,它对 UI 组件做一些事情并调用 self。
但是这个私有的便捷方法是在块内部调用的。
那么知道了,我是否也应该在便捷方法中使用 weakSelf?
人们会在任何地方使用 weakSelf
模式:
否则你会有很强的引用循环;
您正在使用可取消的异步任务并希望在dealloc
中取消它们;或
如果在异步调用仍在进行时关闭视图控制器,您不希望在异步调用期间保留它。
后一点意味着可以将 weakSelf
模式与异步方法的完成块结合使用,而不管是否存在强引用循环。问题很简单,即使视图控制器已被关闭,您是否需要在异步调用期间保留视图控制器。
如果我没理解错的话,您不会将块存储到 self
的 属性 中(或存储到引用 self
的对象中,依此类推)。所以根本没有理由使用weakSelf
,因为无法构建保留循环。
标题几乎涵盖了它。我明白为什么要在块中使用 weakSelf。
但是想象一下我们有一个视图控制器的情况。视图控制器调用具有完成块的数据 API(单例共享实例)。所以在这个调用中 VC 提供了一个 VC 没有引用的完成块。 VC 中还有一个私有的便捷方法,它对 UI 组件做一些事情并调用 self。 但是这个私有的便捷方法是在块内部调用的。
那么知道了,我是否也应该在便捷方法中使用 weakSelf?
人们会在任何地方使用 weakSelf
模式:
否则你会有很强的引用循环;
您正在使用可取消的异步任务并希望在
dealloc
中取消它们;或如果在异步调用仍在进行时关闭视图控制器,您不希望在异步调用期间保留它。
后一点意味着可以将 weakSelf
模式与异步方法的完成块结合使用,而不管是否存在强引用循环。问题很简单,即使视图控制器已被关闭,您是否需要在异步调用期间保留视图控制器。
如果我没理解错的话,您不会将块存储到 self
的 属性 中(或存储到引用 self
的对象中,依此类推)。所以根本没有理由使用weakSelf
,因为无法构建保留循环。