Con*_*sed 1 memory sprite-kit skspritenode swift
我通过调用一个创建SKSpriteNode子类实例的函数,从gameScene和其他对象中创建了一堆sprite.
例如,从GameScene,像这样:
let sizee = CGSize(width: 100, height: 100)
let posi = CGPoint(x: 200, y: 300)
func createSprite(){
let new = Circle(color: SKColor.blue, size: sizee , position: posi)
addChild(new)
new.zPosition = 2
}
Run Code Online (Sandbox Code Playgroud)
在Circle中,我在完成一些动画后删除每个实例:
import SpriteKit
class Circle: SKSpriteNode {
let fade = SKAction.fadeAlpha(to: 0.5, duration: 2)
let myScale = SKAction.scaleX(to: 3, duration: 2)
let die = SKAction.removeFromParent()
override init(texture: SKTexture?, color: UIColor, size: CGSize) {
super.init(texture: texture, color: color, size: size)
}
convenience init(color: UIColor, size: CGSize, position: CGPoint) {
self.init(color: color, size: size)
self.position = position
self.run(SKAction.sequence([fade, die]))
self.run(myScale)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Run Code Online (Sandbox Code Playgroud)
这足以确保它们从内存中释放出来吗?
或者我是否必须做一些其他事情来从游戏世界和记忆中冲洗它们?
几周前Apple已更新此页面:
Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中"正常工作",您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实例使用的内存.
引用计数仅适用于类的实例.结构和枚举是值类型,而不是引用类型,并且不通过引用存储和传递.
有一种方法可以防止实例取消初始化,从而造成泄漏.这称为强参考周期.看看这个答案,你可以详细了解我现在的意思.
看看你的代码我会这样做:
self.run(SKAction.group([fade, myScale], completion: {
[weak self] in
guard let strongSelf = self else { return }
strongSelf.removeFromParent()
}))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
679 次 |
| 最近记录: |