是否应该在UIAlertAction的处理程序中将self捕获为强者?

埃里克

编写a的handler闭包时UIAlertAction,引用应self为强(默认值)weakunowned吗?

已经有相关与这个主题(帖子1234),但老实说,我不看他们如何在这种情况下帮助。

让我们关注以下典型代码:

func tappedQuitButton() {
    let alert = UIAlertController(title: "Confirm quit", message: nil, preferredStyle: .ActionSheet)

    let quitAction = UIAlertAction(title: "Quit", style: .Default) { (action) in
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    alert.addAction(quitAction)

    let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { (action) in
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    alert.addAction(cancelAction)

    presentViewController(alert, animated: true, completion: nil)
}

这是一个UIViewController子类内部的函数self视图控制器也会显示警报。

文档说:

使用弱引用以避免引用周期,只要该引用在其生命中的某个时刻可能没有“价值”即可。如果引用将始终具有值,请改用无主引用。

我可能是盲人,但我仍然看不到如何帮助回答有关的问题UIAlertAction

在上面的代码中,是否有可能在生命的某个时刻self为零是。所以我应该标记selfweak

但是话又说回来,我想不出一个可能的情况,self当调用闭包时,该情况将为零。因此,就关闭而言,self 将始终具有价值所以我应该标记selfunowned

因此,再次,应该如何self在UIAlertAction的处理程序中捕获呢?

好道格

要问自己的关键问题是您的警报对象是否由自己“拥有”。在这种情况下,不是(因为您let alert = ...在函数体中声明了)。因此,您无需将其创建为弱引用或无主引用。

如果警报是自我的财产,那么它将由自我“拥有”,也就是说,当您希望在警报“拥有”的闭包中创建对自我的弱引用时。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我们是否应该在finally块中将本地对象引用分配为null?

是否应该在lambda中通过const引用捕获?

我是否应该在graphql模式文件中将每个对象两次写为'input'和'type'

我应该在分发时捕获Redux Promise错误还是仅在reducer中处理它?

我应该在End_Request事件处理程序中处理给定的ApplicationDbContext吗?

我应该在程序包级别但在http处理程序之外声明变量吗?

我们是否应该在Swift的闭包内部始终使用[unown self]

面板是否应该在框架内部?

我应该在Python中将类别变量存储为整数还是字母?

我们何时应该在React类中将函数定义为箭头函数?

我应该在Angular的类中将方法编写为箭头函数吗

我应该在MongoDB中将此模型建模为树还是关系模型?

是否应该在Visual Studio C#编译器中将此列表初始化器行为报告为错误?

Presenter是否应该在Android MVP设计架构中处理View的所有事件?

JSF是否应该在Ajax重新渲染上处理未渲染的组件?

是否应该在http请求goroutine之外处理所有独立任务?

从Panel继承-我应该在哪里删除处理程序?

在CQRS模式中,应该在域服务或命令处理程序中运行

我们应该在更新后处理重用代码应用程序吗?

我是否也应该在春季为子方法添加@Transactional注释?

什么时候应该在实现之前检查视图是否为 != null?

我们是否应该在 t.references 字段上提及为 nullable: false

是否应该在FluentValidation中为集合创建新的类型?

匿名类对象是否应该在 onDestroy 上设置为 null?

变量引用是否应该在循环的算术(算术上下文)中以 $ 为前缀?

什么时候应该在Rust绑定中为C库使用`&mut self`和`&self`?

我应该在angularjs应用程序中为HTML元素使用Ids吗

我应该在 Flutter 应用程序中为“localhost”使用什么地址?

我是否应该在Windows Java应用程序上使用Android SDK