我对所附错误消息有疑问。它显示变量 closeTree1 周围的 EXC_BAD_ACCESS 代码,定义如下:
let closeTree1 = SKSpriteNode(texture: SKTexture(imageNamed: "tree1"))
正如您在调试区域右侧底部看到的那样,我有一条打印行,显示 Xcode 尚未释放 closeTree1:
closeTree1: 名称:'(null)' 纹理:[ 'tree1' (721 x 1112)] 位置:{2902.64990234375, 577.58203125} 比例:{1.00, 1.00} 大小:{420, 655.16400146484375} anchor :{0.5, 0.5}旋转:0.00
我之前在 Swift 中也没有遇到过早期释放问题,所以我认为这与其他问题有关。我所做的研究表明 EXC_BAD_ACCESS 来自过度释放的变量,并且更多的是 Objective-C 问题。
当我重置场景时,这种崩溃总是不一致地发生。我不是在转换场景,而是从同一场景中删除所有子级并将所有内容添加回来。
我使用了 NSZombies 和断点,但没有效果。我也已经研究这个问题好几天了,并且在看似微不足道的行上看到了其他几个 EXC_BAD_ACCESS 错误。如果有人能对此有所启发,我们将不胜感激。
最佳答案
我能够弄清楚这个问题,因为我没有在问题中提供很多细节,所以我将一般性地讨论它。
closeTree1 仍然被分配,因此这不是手动内存管理或 ARC 问题。我使用的是 SKAction.runBlock({functionname()}),因此在评估操作时执行 functionname() 。长话短说,这是框架中错误的部分,所以我使用 runBlock 设置一个变量来运行 update() 中的函数,现在效果很好:)。结论似乎是,考虑不周的帧进展可能会导致 EXC_BAD_ACCESS。
由于这个错误,我遇到了一些非常奇怪的(我确信这是不可能的)行为。当 EXC_BAD_ACCESS 错误没有出现并且程序运行时,有时同一个 Sprite 会被添加到场景中两次,并且都遵循输入命令!它一定是同一个 Sprite,因为只有一个 SKSpriteNode 具有该图像并遵循这些命令。我不确定这是否是 SpriteKit 的错误,但它现在工作可靠。
关于ios - 具有现有分配的变量上的 Swift EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33769662/