gpt4 book ai didi

closures - 为什么 [weak self] 有效但 [unowned self] 在 Swift 闭包中中断?

转载 作者:IT王子 更新时间:2023-10-29 05:25:06 25 4
gpt4 key购买 nike

此 SpriteKit Action 通过使用完成闭包调用自身来重复。它使用闭包,而不是 SKAction.repeatActionForever(),因为它需要在每次重复时生成一个随机变量:

class Twinkler: SKSpriteNode {
init() {
super.init(texture:nil, color:UIColor.whiteColor(), size:CGSize(width:10.0, height:10.0))
twinkle()
}
func twinkle() {
let rand0to1 = CGFloat(arc4random()) / CGFloat(UINT32_MAX)
let action = SKAction.fadeAlphaTo(rand0to1, duration:0.1)
let closure = {self.twinkle()}
runAction(action, completion:closure)
}
}

我想我应该使用 [unowned self] 来避免闭包的强引用循环。当我这样做时:

let closure = {[unowned self] in self.twinkle()}

它因错误而崩溃:_swift_abortRetainUnowned。但是如果我改用[weak self]:

let closure = {[weak self] in self!.twinkle()}

它执行无误。为什么 [weak self] 可以工作,但 [unowned self] 会崩溃?我什至应该在这里使用其中任何一个吗?

Twinkler 对象在程序的其他地方被强引用,作为另一个节点的子节点。所以我不明白 [unowned self] 引用是如何被破坏的。它不应该被释放。

我尝试使用 dispatch_after() 在 SpriteKit 之外复制这个问题,但我做不到。

最佳答案

如果 self 在闭包中可以为 nil,则使用 [weak self]

如果 self 在闭包中永远不会为 nil,则使用 [unowned self]

如果在您使用 [unowned self] 时崩溃,那么 self 在该闭包的某个时刻可能为 nil,因此您需要使用 [weak self] 代替。

文档中的示例非常适合阐明在闭包中使用strongweakunowned:

https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

关于closures - 为什么 [weak self] 有效但 [unowned self] 在 Swift 闭包中中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24414998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com