Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测到上下文泄漏,msgtracer返回-1(Swift 3)_Swift_Xcode_Swift3_Swift Playground - Fatal编程技术网

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

检测到上下文泄漏,msgtracer返回-1(Swift 3),swift,xcode,swift3,swift-playground,Swift,Xcode,Swift3,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循环并只保留内部时,它工作得

在快速运动场上运行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循环并只保留内部时,它工作得很好。

while(true){部分将使该循环永远执行,并且您的代码可能不会超过该点。如果您希望一个操作永远重复,则有一个SKAction方法用于此操作-请查看
repeat

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

while(true){/code>部分将使循环永远执行,并且代码可能不会超出该点。如果您希望一个操作永远重复,则有一个SKAction方法-请查看
repeat


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

@Fahim是100%正确的,根据发布的代码,您陷入了一个无休止的循环。因此,您的问题是如何摆脱它

您的问题是-如何使此循环满足您的需要。我猜您希望将条件更改为类似while(someVar==true)的值,并在循环内部设置一个条件,以将someVar更改为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
    }
}

@法希姆是100%正确的,根据张贴的代码,你陷入了一个无休止的循环。所以你的问题是如何摆脱它

您的问题是-如何使此循环满足您的需要。我猜您希望将条件更改为类似while(someVar==true)的值,并在循环内部设置一个条件,以将someVar更改为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
    }
}

我最终完全重写了它,并使用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"
    )

我最终完全重写了它,并使用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"
    )

我使用更多的singletong解决这个问题。例如,singletong中的循环中的SKView()。

我使用更多的singletong解决这个问题。例如,singletong中的循环中的SKView()。

我认为现有的答案没有抓住要点。您有两个“线程”您正在处理的是:运行例程的活动线程(它将继续以最快的速度将新的旋转动作推送到节点的动作列表上)和动作处理线程(它本身实际上不是一个“线程”,但可以想象为用于此问题的一个线程)这是实际执行旋转操作的地方

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

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


正如法希姆所建议的那样,用一个重复的动作替换它,你就会很好。然后你只需要一个某种类型的触发器来停止这个动作(给它一个名称,让它只结束一个动作,或者在触发器触发时停止这个节点上的所有动作)。

我认为现有的答案没有抓住要点。你有两个“线程”您正在处理的是:运行例程的活动线程(它将继续以最快的速度将新的旋转动作推送到节点的动作列表上)和动作处理线程(它本身实际上不是一个“线程”,但可以想象为用于此问题的一个线程)这是实际执行旋转操作的地方

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

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


按照Fahim的建议,用一个重复的动作来替换它,这样你就很好了。然后你只需要一个某种触发器来停止动作(给它一个名称,让它只结束一个动作,或者在触发时停止这个节点上的所有动作).

这确实消除了错误,但现在的问题是,如果我将someVar设置为false,我将如何在while循环结束后重新检查条件是否切换回true?更具体地说,我尝试检查鼠标指针是否在rect内,如果在rect内,我希望rect朝着鼠标指针的位置旋转奥德,在我把鼠标指针从矩形上取下后,我该如何检查我是否将鼠标指针放回矩形上?哦,你需要做更多的事情。(你的问题中没有任何提示。不过,我发现这是一个好问题。)两个想法:(1)首先,也许你正在思考一些事情。如果你喜欢旋转,考虑其他的应用程序。他们检查鼠标指针的位置吗?或者他们让你用这些术语来思考吗?我不知道,有很多方法可以做到这一点。(2)查看每一个视图应该有的东西(我主要使用UIView,而不是NSView)-HITestTo()我相信UIKit或Cocoa视图都有它的本地版本,但每个视图都有一个CALayer,它跟踪视图是否包含