- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
有什么方法可以检查 unowned(safe)
Swift 引用的“可用性”?所以,我在这个例子中寻找一个像 isReferenceAccessible
这样的假设函数:
func someMethod() {
someAsyncOperation(parameters) { [unowned(safe) self] in
guard isReferenceAccessible(self) else {
return
}
self.someAnotherMethod()
}
}
免责声明:这个问题与weak
引用无关!我知道strong
、unowned
和weak
引用有效。而且我不想使用 weak
引用(因为它可能很慢且可变)。我知道 unowned(safe)
引用仍然会被分配,即使当我们试图访问它时它已经被 deinited
了。而且我知道编译器可以执行此检查,并且它会在应用程序崩溃之前实际检查它。
因此,我相信它可以成为打破现代 Swift 中的引用循环的非常强大且性能良好的技术/范例。
此外,我相信它可以成为一个很棒的语言功能!例如,假设我们有一个名为 shared_ownership
的修饰符,它按照上面描述的行为工作:
method(parameters) { [shared_ownership self] in
self.someAnotherMethod()
}
... 像这样实现:
method(parameters) { [unowned(safe) self] in
guard isReferenceAccessible(self) else {
return
}
self.someAnotherMethod()
}
... 具有副作用(没有 weak
相关的复杂性和性能损失)等同于:
method(parameters) { [weak self] in
guard let strongSelf = self else {
return
}
strongSelf.someAnotherMethod()
}
哦,那太棒了!
关于 the differences between weak
, unowned(safe)
, and unowned(unsafe)
的更多信息.
我发现了与上述功能相关的很棒的 Swift 提案:Allow using optional binding to upgrade self from a weak to strong reference .
最佳答案
突然间,我发现我最初的基本假设是错误的,即 Swift 中的 weak
引用可能很慢。从sources可以看出,Swift 实际上对 weak
和 unowned
引用使用了几乎相同的实现。所以 weak
引用几乎和 unowned
引用一样快。
(但是 Objective-C 是完全不同的故事,它使用 sidetable 跟踪所有指向周引用的指针,并将 deinit、deallocate 和 zeroing 作为一个步骤。而且它可能很慢。)
因此,我的问题毫无意义。我必须使用周引用并按照我在原始问题的最后一段代码中提出的建议将其解包。
关于swift - 有没有办法检查 `unowned` (实际上是 `unowned(safe)` )引用已被取消?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34843124/
有什么方法可以检查 unowned(safe) Swift 引用的“可用性”?所以,我在这个例子中寻找一个像 isReferenceAccessible 这样的假设函数: func someMetho
Apple 的 Swift Programming Language Guide除了 weak 和 之外,还提到了捕获说明符 unowned(safe) 和 unowned(unsafe)无主。 我(
在下面的代码中,如果Swift数组是按值传递的,是否必须要有unowned? Category 有一个 Swift 数组的属性,而不是一个 Item,所以 unowned 不是必需的,对吧? fina
基本上我有以下 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITa
我对 swift 中的这个主题感到困惑,据说无主引用必须始终有一个值并且不能是可选的,也意味着它们不能设置为“nil”....好吧,我刚刚看到了一个程序苹果的 Swift 文档表明,实例“A”具有对实
在 Swift 中存在递归内存泄漏问题,其中一个单例在另一个单例的闭包内被调用。 NetworkManager.sharedInstance.doThingWithCompletion(urlStri
以下模式在 iOS 应用中经常发生: class MyViewController: UIViewController { let myModel = MyModel() overri
我正在尝试创建一个闭包来清除我的缓存,这两个都是实例变量。当我尝试调用 [unowned self] 时,出现错误“‘unowned may only be applied to class and
关于 ARC 的教程很多。但我不理解 unowned 或 weak 的明确工作原理,因为引用捕获的变量如何变为 null。 苹果文档: Define a capture in a closure as
我正在尝试集成 Face/Touch ID 登录,我在 Apple 的文档中看到了 [unowned self],在一个闭包内。那是什么,有什么好处? 示例代码: let context = LACo
所以我一直在做一些关于 UIViewPropertyAnimator 的阅读,在我一直在看的例子中,他们做了这样的事情: animator = UIViewPropertyAnimator(durat
这个问题在这里已经有了答案: What is the difference between a weak reference and an unowned reference? (7 个答案) 关闭
我在一个闭包中有一个闭包,第二个闭包使用 self,所以两者都应该有 unowned self 还是只有第二个闭包应该有它? dispatch_async(backgroundQueue) { [un
我有一个保留循环,所以我的 viewcontroller 的 deinit 不会被调用,我试图通过添加 [unowned self] 来解决这个问题,但我不太确定在我的案例中将 unowned 放在哪
WWDC 2014 第 403 场 session Intermediate Swift和 transcript ,有以下幻灯片 演讲者说,在这种情况下,如果我们不使用[unowned self],就
我遇到了这段我不理解的 Swift 代码。分配给 navigationCallback 的是什么?什么是 [unowned self]?如果我能看到 Objective-C 中的等效示例,我想我会更好
对于我添加了 deinitializers 的 swift 编程指南中的以下代码,无论是否使用 unowned 关键字,生成的调试打印输出都是相同的。 swift 编程指南说,当引用彼此类实例的两个属
我有一个带有完成处理程序的函数,返回一个或多个参数。 在客户端中,当执行完成处理程序时,我希望有一个 unowned 对 self 的引用,以及对传递的参数的访问权。 这是说明问题和我要实现的目标的
每当我执行异步网络请求时,可能是在请求到达时 self 已经为 nil(例如,ViewController 已经被关闭)。 为了防止这种情况,我通常将自己描述为软弱的: future.onSu
我正在尝试编写一个简单的闭包作为完成处理程序,并在闭包内设置文本框的文本值: class ViewController: UIViewController { @IBOutlet var te
我是一名优秀的程序员,十分优秀!