我使用SpriteKit创建了一个简单的游戏,但是每次运行游戏时,模拟器中的内存使用量增加约30mb,但在游戏结束时不会减少.
当我运行游戏超过十次时,模拟器变得越来越慢并最终崩溃.
在这个简单的游戏中,我有两个控制器和一个gamecene:
MainController通过触发按钮调用GameViewController
在GameViewController中,gamescene以这种方式初始化:
class GameViewController: UIViewController
{
var skView:SKView!
var scene:GameScene!
override func viewDidLoad() {
super.viewDidLoad()
scene = GameScene(size: view.bounds.size)
skView = view as SKView
skView.ignoresSiblingOrder = true
scene.scaleMode = .ResizeFill
scene.viewController = self
skView.presentScene(scene)
}
//with a prepareForSegue deinitialises the scene and skview:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "GameFinished"{
scene.removeAllActions()
scene.removeAllChildren()
scene.removeFromParent()
scene = nil
skView.presentScene(nil)
skView = nil
let target = segue.destinationViewController as MainController
}
}
}
Run Code Online (Sandbox Code Playgroud)
在GameScene中,viewController是一个属性
var viewController:GameViewController? = …
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我有两个按钮。
button1 是可选的,它被分配了从超级视图中删除自己的功能。
button2 被分配了一个函数,将 button1 添加到 superview,解包 button1 的可选类型。
我希望在调用之后从内存中释放 button1 .removeFromSuperview()
,这样当你点击 button1 后点击 button2 时,应用程序会崩溃:
var button1: UIButton?
override func viewDidLoad() {
super.viewDidLoad()
var frame1 = CGRectMake(100, 150, 150, 40)
button1 = UIButton(frame: frame1)
button1!.setTitle("remove button 1", forState: .Normal)
button1!.setTitleColor(UIColor.blackColor(), forState: .Normal)
self.view.addSubview(button1!)
button1!.addTarget(self, action: "remove:", forControlEvents: .TouchUpInside)
let frame2 = CGRectMake(100, 250, 150, 40)
let button2 = UIButton(frame: frame2)
button2.setTitle("display button 1", forState: .Normal)
button2.setTitleColor(UIColor.blueColor(), forState: .Normal)
button2.addTarget(self, action: "display:", forControlEvents: .TouchUpInside)
self.view.addSubview(button2)
}
func remove(sender: …
Run Code Online (Sandbox Code Playgroud)