获取应用程序的通知设置时是否需要 Weak self

Is Weak self required while fetching notification settings of the app

我正在查询通知设置值,但我想知道是否需要 [weak self]

有人请澄清:

UNUserNotificationCenter.current().getNotificationSettings { [weak self] appsettings in
    var mybool = false
    if appsettings.authorizationStatus == .authorized {
        mybool = true
    }
    DispatchQueue.main.async { [self] in
        self?.vu.isEnabled = mybool
    }
}

如果 [weak self] 捕获列表的目的是防止强引用循环,那么,不,没有必要。这个 getNotificationSettings 闭包是异步调用的,它的闭包(以及它捕获的任何东西)都会被快速释放,所以由闭包引入的任何强引用都会很快得到解决。

但是,如果您使用 [weak self] 来避免在异步任务 运行 时不必要地保留强引用(例如,在不太可能的情况下 self 在此之前被取消闭包运行),那么,是的,weak 参考是谨慎的。如果关闭的唯一目的是更新可能不再可见的控件,则保留强引用毫无意义。

有人会说 [weak self] 也是谨慎的,因为看一眼代码就可以立即确定没有引入强引用循环。您不必浪费任何时间推理通知中心API;您会立即发现不存在强引用循环风险。任何时候你都可以一目了然地推理你的代码,这是一件好事。

简而言之,[weak self]捕获列表不是必需的,但要谨慎。


两个不相关的观察结果:

  1. 我会在对主队列的调度中删除 [self] 捕获列表。 [self] 捕获列表的 whole idea 允许闭包内的隐式 self 引用,因为已经声明了使用 self 的意图。

    但这是在 getNotificationSettings[weak self] 闭包内,而且您正在使用 self?. 可选链接语法。 [self] 捕获列表不仅没有实际意义,而且只会向您的代码的未来读者发送相互矛盾的消息。我会删除 [self] 捕获以分派到主队列。

  2. 如果您提出关于删除 [weak self] 捕获列表的问题是为了简化代码,我会保留 weak 捕获,但简化其余部分:

    UNUserNotificationCenter.current().getNotificationSettings { [weak self] settings in
        DispatchQueue.main.async {
            self?.vu.isEnabled = settings.authorizationStatus == .authorized
        }
    }