捕获@objc类的实例(以 swift 方式编写,但以@objcNSObject的子类进行注释)时,我遇到了这种奇怪的崩溃。它发生在分配闭包时而不是在调用时发生,因此问题不在于捕获的值将被释放,然后调用闭包。它是随机发生的,有时会更快崩溃,有时会崩溃。我在Swift的早期版本中遇到了这个错误(我认为是Swift 1.2),但是现在我使用的是2.1,并且也发生了此崩溃。

当我将[unowned x]更改为[weak x],然后通过强制展开x!.doSomething()对其进行访问时,它工作得很好,这使我相信这是Swift中的错误,而不是我的代码中的错误。但是,在打开bugs.swift.org的票之前,我想引起更多关注,以确保我没有丢失任何东西。

这里也有人提到:
http://www.codeproject.com/Articles/791304/Resolving-strong-references-between-Swift-and-Obje
这里:
https://www.reddit.com/r/swift/comments/3vhwmj/unowned_bug_in_closure_causes_attempted_to_retain/
和这里:
https://forums.developer.apple.com/thread/9873

但是除了将捕获更改为weak并在以后强制将其解包外,没有其他解决方案。

最佳答案

通常,在处理某些包含的objc类时,我更喜欢使用此代码而不是unowned:

[weak self] in
guard let strongSelf = self else { return }
// use strongSelf below

关于ios - 当将@objc类捕获为未拥有时,_swift_abortRetainUnowned,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34435776/

10-14 21:51
查看更多