Val*_*gin 6 memory-management weak-references unsafe-unretained swift
有没有办法检查unowned(safe)Swift引用的"可用性"?所以,我正在寻找一个假设的函数isReferenceAccessible,如下例所示:
func someMethod() {
someAsyncOperation(parameters) { [unowned(safe) self] in
guard isReferenceAccessible(self) else {
return
}
self.someAnotherMethod()
}
}
Run Code Online (Sandbox Code Playgroud)
免责声明:这个问题与weak参考文献无关!我知道如何strong,unowned以及weak引用的工作.而且我不想使用weak引用(因为它可能很慢,而且可变).我知道unowned(safe)即使已经deinited在我们尝试访问它时,仍然会分配引用.我知道编译器可以执行此检查,并在应用程序崩溃之前实际检查它.
因此,我相信它可以是非常强大且执行良好的技术/范例,可以打破现代Swift中的参考周期.
而且,我相信它可以是一个很棒的语言功能!例如,让我们假设我们已经调用了修饰符shared_ownership,它的工作思路如上所述:
method(parameters) { [shared_ownership self] in
self.someAnotherMethod()
}
Run Code Online (Sandbox Code Playgroud)
......实现如下:
method(parameters) { [unowned(safe) self] in
guard isReferenceAccessible(self) else {
return
}
self.someAnotherMethod()
}
Run Code Online (Sandbox Code Playgroud)
......副作用(没有weak相关的复杂性和性能惩罚)相当于:
method(parameters) { [weak self] in
guard let strongSelf = self else {
return
}
strongSelf.someAnotherMethod()
}
Run Code Online (Sandbox Code Playgroud)
哦,太棒了!
有关更多信息之间的差异weak,unowned(safe)以及unowned(unsafe).
我找到了与上面讨论的功能相关的令人敬畏的Swift提议:允许使用可选绑定将self从弱引用升级到强引用.
突然间我发现我weak在Swift 中引用的原始基础假设可能很慢是错误的.正如我们从源代码中看到的,Swift实际上使用了几乎相同的实现weak和unowned引用.所以weak参考几乎和unowned参考一样快.
(但是Objective-C是完全不同的故事,它使用sidetable跟踪所有指向周参考的指针,并将deinit,deallocate和zeroing作为一步.它可能很慢.)
因此,我的问题毫无意义.我必须使用周参考并解开它,就像我在原始问题的最后一段代码中提出的那样.
更新:这是一篇由令人难以置信的Mike Ash撰写的精彩文章,描述了Swift中引擎的工作方式weak和unowned参考.
| 归档时间: |
|
| 查看次数: |
889 次 |
| 最近记录: |