_swift_abortRetainUnowned 将 @objc 类捕获为无主时
Posted
技术标签:
【中文标题】_swift_abortRetainUnowned 将 @objc 类捕获为无主时【英文标题】:_swift_abortRetainUnowned when capturing @objc class as unowned 【发布时间】:2015-12-23 12:31:07 【问题描述】:我在捕获 @objc
类的实例时遇到了这种奇怪的崩溃问题(用 swift 编写,但使用 @objc
和 NSObject
的子类进行注释)。它发生在分配闭包时而不是在调用时,所以问题不在于捕获的值会被释放然后调用闭包。它随机发生,有时它会更快崩溃,有时会更晚。我在早期版本的 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
并稍后强制解包之外,没有其他解决方案。
【问题讨论】:
在捕获列表中使用 unowned 时,您是否都找到了原因以及为什么它不起作用? 不,我没有,我必须将所有 [unowned x] 更改为 [weak x] 才能摆脱这些崩溃。 【参考方案1】:当我需要处理一些包含的 objc 类时,通常我更喜欢使用此代码而不是 unowned
:
[weak self] in
guard let strongSelf = self else return
// use strongSelf below
【讨论】:
以上是关于_swift_abortRetainUnowned 将 @objc 类捕获为无主时的主要内容,如果未能解决你的问题,请参考以下文章