检测到上下文泄漏,msgtracer返回-1(Swift 3)

时间:2017-03-27 01:33:39

标签: swift xcode swift3 swift-playground

在Swift Playground上运行Xcode 8.2。它也使Xcode无法响应。这是我得到的错误。

Context leak detected, msgtracer returned -1

我已将问题追溯到这些代码行

while (true){
    let rotate = SKAction.rotate(toAngle: angle - CGFloat(M_PI_2), duration: 1)
    crank.run(rotate)
    }

当我注释掉while循环并只留下内部时,它可以正常工作。

5 个答案:

答案 0 :(得分:0)

while (true){部分将使该循环永久执行,并且您的代码可能不会超出该点。如果你想让一个动作永远重复,那么有一个SKAction方法 - 看看repeat

如果您删除了while (true){条件,而是使用repeat操作,我相信您的代码应运行良好。

答案 1 :(得分:0)

@Fahim是100%正确的,通过发布的代码你被困在一个无限循环中。那么你的问题是如何摆脱它?

问题在于 - 如何使这个循环做你需要的。我猜你想要将条件更改为 while(someVar == true),并将条件置于循环中以更改 someVar < / em>为false。但只有你知道那是什么条件。语法如下:

let someVar = true
while (someVar == true){
    let rotate = SKAction.rotate(toAngle: angle - CGFloat(M_PI_2), duration: 1)
    crank.run(rotate)
    if someCondition == isMet {   // THIS IS FOR YOU TO DECIDE!
        someVar = false
    }
}

答案 2 :(得分:0)

我最终完全重写它并使用SKAction.repeatForever运行SKAction(旋转),并且仅在条件为false时终止。

crank.run(
        SKAction.repeatForever (
            SKAction.sequence([
                SKAction.wait(forDuration: 0.1),
                SKAction.run({

                    let angle = atan2(self.point.y - crank.position.y , self.point.x - crank.position.x)
                    let rotate = SKAction.rotate(toAngle: angle - CGFloat(M_PI_2), duration: 0.25)
                    crank.run(rotate)
                    if(!(crank.frame.contains(self.point))) {
                        self.removeAction(forKey: "New Thread")
                    }
                })
                ])
        ),
        withKey: "New Thread"
    )

答案 3 :(得分:0)

我认为现有的答案在这里没有抓住重点。您有两个正在处理的“线程”:运行例程的活动线程(它将继续将新的旋转动作尽可能快地泵送到节点的动作列表中)和动作处理线程(实际上不是“线程”本身,但可以将其想象为一个问题),这是实际执行旋转动作的位置。

基本上,在给定的时间片中,“主”执行线程可能会将100k个“旋转”动作泵送到您节点的动作列表中,SpriteKit引擎将尽可能高效地同时处理所有这些动作(我相信通过删除重复的动作,但我对此并不乐观。

这样做的结果是,您要做的工作比必须要做的要多得多,并且在自旋循环和SKAction处理代码中都燃烧CPU,试图从每次添加到节点的数百万个操作中恢复进行处理。

按照Fahim的建议,通过重复操作将其替换,您会很好。然后,您只需要某种触发器即可停止操作(给它起个名字即可结束一个操作,或者在触发器触发时停止该节点上的所有操作)。

答案 4 :(得分:-1)

我使用更多的singletong来解决这个问题。例如单圈内循环内的SKView()。