当 self 被释放时我应该调用完成处理程序吗

Posted

技术标签:

【中文标题】当 self 被释放时我应该调用完成处理程序吗【英文标题】:Should I call completion handler when self is deallocated 【发布时间】:2018-07-27 22:37:53 【问题描述】:

我们可能都使用过以下模式。这可能无关紧要,我只是好奇当self 不再存在时,我是否还应该调用完成处理程序?

var uid: String

func asyncTask(completion: @escaping(Result)->()) 
    anotherAsyncTask()  [weak self] (result) in
        guard let uid = self?.uid else  
            completion(.error) // Should I call this???
            return 
        
        // consume result
    

【问题讨论】:

【参考方案1】:

由于self 被取消初始化,所以调用没有意义

completion(.error) // Should I call this???

因为结果已经在这里return足够了

【讨论】:

我不同意。返回枚举中存在错误情况。它用于报告错误,而释放 self 就是其中一种错误情况。 @DuncanC 根据你的意见,当用户进入一个VC,然后在回调返回之前快速返回,一个弹窗告诉他一个反馈,这在实际应用中实际上不会发生,操作将其分类为代码作为错误,用户不应该意识到这一点,你也认为自我释放是一个应该报告的错误 公平点。您必须考虑在调用任务的完成处理程序之前释放 self 意味着什么。可能存在一些情况,例如用户关闭的视图控制器,您只想忽略这种情况,或者将成功枚举传递给完成处理程序。这取决于您的设计。

以上是关于当 self 被释放时我应该调用完成处理程序吗的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:在对象上调用释放:它会立即释放吗?

我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?

释放自动释放对象不会使我的应用程序崩溃,为啥?

C语言 调用函数完后释放内存吗?

这个变量应该手动释放吗?

16. 指针函数和函数指针