将@objc类捕获为无主时,_swift_abortRetainUnowned

时间:2015-12-23 12:31:07

标签: ios objective-c swift

我在捕获@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并强制稍后展开之外,没有解决方案。

1 个答案:

答案 0 :(得分:2)

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

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