_swift_abortRetainUnowned 将 @objc 类捕获为无主时

Posted

技术标签:

【中文标题】_swift_abortRetainUnowned 将 @objc 类捕获为无主时【英文标题】:_swift_abortRetainUnowned when capturing @objc class as unowned 【发布时间】:2015-12-23 12:31:07 【问题描述】:

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

【问题讨论】:

在捕获列表中使用 unowned 时,您是否都找到了原因以及为什么它不起作用? 不,我没有,我必须将所有 [unowned x] 更改为 [weak x] 才能摆脱这些崩溃。 【参考方案1】:

当我需要处理一些包含的 objc 类时,通常我更喜欢使用此代码而不是 unowned

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

【讨论】:

以上是关于_swift_abortRetainUnowned 将 @objc 类捕获为无主时的主要内容,如果未能解决你的问题,请参考以下文章

简易先进先出队列-自用

函数参数

多重背包

合租房合同模板

启动代码分析 02

ACM数论 求幂乘