内存随着Swift中ViewController的更改而增加

内存随着Swift中ViewController的更改而增加,swift,uiviewcontroller,ios8,Swift,Uiviewcontroller,Ios8,我正在制作一本互动的儿童读物,使用故事板来布置我的书的12页中的每一页。然而,每次我切换视图控制器转到另一个故事板时,我的内存几乎每次增加一倍。我不断收到内存警告和崩溃,在调试导航器中,我看到内存从~36跳到~54跳到~95,直到超过200 我尝试过使用segue转换和编程转换,如下所示: class page01VC:UIViewController { @IBOutlet var kid: UIImageView! let kidStanding = UIImage(named: "01_

我正在制作一本互动的儿童读物,使用故事板来布置我的书的12页中的每一页。然而,每次我切换视图控制器转到另一个故事板时,我的内存几乎每次增加一倍。我不断收到内存警告和崩溃,在调试导航器中,我看到内存从~36跳到~54跳到~95,直到超过200

我尝试过使用segue转换和编程转换,如下所示:

class page01VC:UIViewController {

@IBOutlet var kid: UIImageView!
let kidStanding = UIImage(named: "01_boyStanding")
let kidJumping = UIImage(named: "01_boyJumping")
var kidJump:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
var boyCounter: CGFloat = 0.0
var boyJumpTimer:NSTimer!

@IBOutlet var snowflakes: UIImageView!
let flakes = UIImage(named: "01_flakes")
var flakeTimer:NSTimer!

override func loadView() {

    super.loadView()

    flakeTimer = NSTimer.scheduledTimerWithTimeInterval(0.008, target: self, selector: Selector("moveSnow"), userInfo: nil, repeats: true)
    //NSRunLoop.currentRunLoop().addTimer(flakeTimer, forMode: NSRunLoopCommonModes)

    kidJump.frame = CGRectMake(140, 250, 338, 478)
    kidJump.addTarget(self, action: "kidJumpTimer:", forControlEvents: UIControlEvents.TouchDown)

    self.view.insertSubview(kidJump, aboveSubview:kid)

}

//Other functions I have made would be here
}

有人知道我如何防止这种记忆积累吗?提前谢谢

是否在
视图中删除对计时器的引用?在
视图中启动计时器将出现
,并在
视图中删除它们。我认为,即使视图不可见,计时器仍然存在

请参阅专门的“运行循环中的调度计时器”(该部分的底部段落)和
invalidate
方法


另外,请查看iOS应用程序编程指南和iOS视图控制器编程指南。

当视图控制器不再使用时,您是否正在删除
NSTimer
s?不,我自己没有删除任何内容。我看的每一个地方都说ARC会处理事情,但我猜不是这样!我不确定视图更改后如何删除内容。请参阅我的书中有关NSTimer内存管理的讨论:只要计时器没有失效,视图控制器就会保留,因此图像也会保留。因此,您正在打开并保留所有这些图像。它们太大了,所以你的内存不足。我只是尝试了这个方法,同时还尝试了使计时器无效和将计时器指定为零,我还尝试了使用ViewWillExbeen和ViewWillEvery,但我仍然有巨大的内存增长。我还尝试从每个页面中完全删除计时器,但内存仍在增加。这就是我以编程方式切换视图控制器的方式:currentView.view.removeFromSuperview()currentView=myStory.InstanceEviewController WithiIdentifier(“页面(页码)”)作为UIViewController self.view.insertSubview(currentView.view,atIndex:0),删除视图不会删除视图控制器,并且不会调用
viewdidegase
。您应该使用多个子视图控制器。iOS过渡视图控制器上的大多数应用程序都带有UINavigationController或uitabarcontroller。您当前的方式可以切换视图,但不能切换视图控制器。