小编Fan*_*ang的帖子

在swift中,如何在删除SKScene后让内存恢复正常?

我使用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)

memory sprite-kit skscene swift

12
推荐指数
1
解决办法
2573
查看次数

调用view.removeFromSuperview() 后是否需要将view 设置为nil?

在下面的代码中,我有两个按钮。

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)

memory-management uibutton uiviewcontroller uiview swift

5
推荐指数
2
解决办法
3187
查看次数