- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
每当我执行异步网络请求时,可能是在请求到达时 self 已经为 nil(例如,ViewController 已经被关闭)。
为了防止这种情况,我通常将自己描述为软弱的:
future.onSuccess(context: Queue.main.context, callback: { [weak self] result in
if let strongSelf = self {
// Do some stuff with self, which is now guaranteed to be not nil
// strongSelf.someMethod()
}
})
或者我可以将 self 捕捉为无主:
future.onSuccess(context: Queue.main.context, callback: { [unowned self] result in
// Do some stuff with self
// self.someMethod()
})
我不关心请求返回,因为当请求在 ViewController 已经被关闭的时间点返回时,我没有从请求中显示任何内容。所以我不想通过关闭让自己“活着”。
我现在的问题是 - 在这种情况下将 self 捕获为无主是否足够?还是我必须一直用 [weak self] 做 nil 检查?如果在请求到达并且 self 已经为 nil 时使用 unowned 捕获会发生什么情况 - 闭包是否仍然存在并且会执行并会在访问 nil 时触发运行时错误?还是闭包也会与 self 一起解除分配,请求会遇到“无效”?
或者在这种情况下我可以同时忘记 weak 和 unowned 因为当 self get 被释放时闭包也将被释放,所以在请求到达时不存在访问 nil 的危险?
PS:我知道关于这个主题已经有很多问答,但如果我不关心异步到达,我找不到答案。
最佳答案
如果您在没有 weak
或 unowned
关键字的情况下捕获 self,您的 View Controller 将被闭包保留,并且不会在闭包结束前释放。 weak
和 unowned
之间的区别是 weak
是一个 Optional 并且需要条件绑定(bind)作为安全检查。另一方面,unowned
并不是万无一失的。它假定您的 View Controller 仍然存在,如果它不存在,它将崩溃。有关详细信息,请参阅 this answer .
关于swift - 在异步网络请求中捕获 self weak 或 unowned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33372770/
我正在阅读为 STM32 定义中断 vector 的代码 here .出于某种原因,同时使用了 __attribute__((weak)) 和 #pragma weak: void __attribu
Vala 中的弱引用和无主引用有什么区别。 根据我从 Vala 教程中学到的知识,弱引用和无主引用都不算在内,当真实实例超出范围时,它们将引用 null(!!)。 为什么出于一个原因应该有两种不同的方
正如我们所知,在 block 中使用 strong self 会导致循环保留和内存泄漏。通常的做法是在 block 中使用弱 self ,还是将弱 self 分配给 block 中的 strong s
所以我正在尝试对我用 swift 编写的代码进行一些润色和分析。我有一堆问题很详细,通过搜索弱引用和强引用等主题很难找到它们。 例如,我没有看到 XCode 提示下面用于 socket 的任何一行。如
为什么weak.lock()返回 nullptr在此代码片段中: std::weak_ptr weakPtr1 = std::make_shared(6); std::cout shar
创建了一个模板函数C++ template void myswap(T&d,T&s) 。Main 将其用于 int、double、complex 类型。使用 g++ 编译源代码。通过 nm 转储符号
什么时候不应该鼓励弱类型?大型项目中不鼓励使用弱类型吗?如果左侧像下面这样强烈键入,那将是该规则的例外吗? int i = 5 string sz = i sz = sz + "1"
在接下来的 0.5 秒延迟期间,tableViewManager 可能会被释放。我想确保在嵌套闭包内与 textView 交互时 textView 是弱的。我该怎么做? tableViewManage
动机 我有 2 个静态库,libStatic1.a 和 libStatic2.a。此外,我还有许多使用 libStatic1.a 编译的 SO(共享对象)。至此,libStatic1.a 和 libS
让我们调用一些函数,它有一个转义闭包作为参数: someFunc(complition: { self.someAnotherFunc() }) 相当于: someFunc(complitio
我想通过使用聚合来构建一个包含多个子对象的类TParent。有些对象是独立的,而有些对象也可能依赖于其他子对象。所有子对象都必须有对父对象的引用。我还想尽可能使用接口(interface)。 为此,我
我正在编写一个需要 SQL Server SMO 库的 .NET 工具。我不在乎它是来自 Server 2005 (9.0)、2008 (10.0) 还是 2008 R2(可能是 10.5,没有检查)
所以我最近一直在考虑一些自动内存管理的想法——特别是,我一直在考虑实现一个基于引用计数的内存管理器。当然,每个人都知道循环引用会扼杀幼稚的引用计数。解决方案:弱引用。就我个人而言,我讨厌以这种方式使用
我知道,在非引用类型数据上使用 weak 时,这会引发错误。但是,我在我自己创建的类上使用它。只是想知道是否有人遇到同样的问题。 internal static func registeruUser(
我有一个名为 Panel 的类,它包含这样一个弱属性: @property (nonatomic, weak) Dialog *container; 在 Instruments 中,我可以看到 set
这个问题与this post非常相似- 但不完全是 我在 .csv 文件中有一些数据。数据精确到第 4 位 (#.####)。 在 Excel 或 SAS 中计算平均值给出的结果精确到第 5 位 (#
我正在编写一个名为“MQTT_interface”的类。我需要在此类的“重新连接”方法中使用“回调”功能。我想开发人员会为自己编写函数“回调”,如果没有,将会有一种同名的弱函数(“回调”),它会向控制
在 Java 中,如果内存不足,弱引用将被垃圾回收。在 Linux 中,malloc() 总是返回一个强引用,即。在调用者调用 free() 函数之前,指针永远不会被释放。 我想分配一个缓冲区用于缓存
我可能对 weak 理解有误: 我的情况: 具有一些弱回调的“物理层” 实现这些回调的“框架层”,并为应用层提供新的 WEAK 回调 主要 - 应用层。 phy.h #pragma once void
我很想知道是否有一种方法可以在 Linux、OS X 或 Windows 等常见操作系统的用户空间中分配“弱”内存(标准接口(interface)显然不可能)。我的意思是那种 mmap(),如果操作系
我是一名优秀的程序员,十分优秀!