我做了一个快速项目来了解SpriteKit是如何从内存中解放地图集的。每次点击屏幕时,都会创建一个地图集,并将其加载到内存中。对地图集的唯一引用是在下面的代码中看到的,我认为由于var位于非转义函数中,所以它不包含强引用。我的目标是最终释放加载到内存中的以前的地图集,但是内存堆积起来,最终崩溃。
我知道地图集只能加载一次,苹果在这里提出的三点(与雪碧合作)是关于为什么纹理不会被释放的。
有人能帮我弄明白为什么会这样吗?
class GameScene: SKScene {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
var atlas:SKTextureAtlas? = SKTextureAtlas(named: "Title")
atlas?.preload {
atlas = nil
print("Loaded")
}
}
}

每次检测到触摸时,都会创建一个新的内存级。
发布于 2018-10-07 16:07:31
挖掘其他帖子(第二答案),发现atlas.preload似乎存在内存泄漏漏洞,并发现预加载整个SKTextureAtlas的工作是调用类似的
for texture in self.textureNames {
SKTexture(imageNamed: texture).size()
}发布于 2018-10-06 18:35:37
每次触摸屏幕时,您都在分配和初始化一个新的纹理,这意味着在函数第二次运行时将不会有引用,因为它将被一个新的纹理指针替换。
要解决这个问题,请在var声明之前添加静态变量,这将防止变量被新指针覆盖,直到程序完成。
例如,如果你把这个函数
var nm = 5
print(nm) // will print 5 every time
nm += 1
print(nm) // will print 6 every time nm每次在声明前放置静态时都会被覆盖,static var nm = 5会解决这个问题,每次函数运行时都会看到数量增加
https://stackoverflow.com/questions/52682096
复制相似问题