繁体   English   中英

在Swift中使用图片时发生内存泄漏?

[英]memory leak when using images in Swift?

我现在有一个非常简单的应用程序,带有两个viewControllers。 我在它们之间有一个过渡(当然是有顺序的),并且两个屏幕上都有很多图像和带有图像的按钮。

我发现在屏幕之间切换时会发生内存泄漏。 我猜,每次您再次打开viewController时,都会以某种方式再次加载图像。 每次添加大约6MB,我很确定这些图像总共少于1MB。 那么也许还有其他东西渴望所有的记忆吗?

我有6个图像视图,并且在默认模式下使用了交叉溶解过渡。 我希望可以在此处复制一些代码,但这是一个大项目,我不知道哪种代码会有所帮助。

所以我的问题是:是什么导致了这个问题(最好是如何解决这个问题)? 是图像,还是过渡的痕迹。

任何帮助将非常感激! 谢谢!

---编辑:这是图像的一些代码

    // variables of the bottom menu bar
    @IBOutlet weak var cameraButton: UIButton!
    @IBOutlet weak var redoButton: UIButton!
    @IBOutlet weak var saveButton: UIButton!
    @IBOutlet weak var shareButton: UIButton!
    @IBOutlet weak var overLay: UIImageView!



    // this function lets the statusbar disappear
    override func prefersStatusBarHidden() -> Bool {
        return true
    }



    override func viewDidLoad() {
        super.viewDidLoad()
        overLay.image = nil
          // variables for accessing web images
    let url = NSURL(string: "http://www.fteunen.com/app/overLay.png")
   let urlRequest = NSURLRequest(URL: url!)
        NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue(), completionHandler: {
            response, data, error in

            if error != nil {

              println("Something happened i guess, not good!!")
            } else {
               //let image = UIImage(data: data)
                self.overLay.image = UIImage(data: data)
            }

        })

    }

而且我不知道在哪里可以从segues中找到代码。 我只是点击了一些选项。

----编辑:第二个viewController(一个包含所有图像的视图)和dismissViewController:

    class ViewController2: UIViewController {

    // variables of the bottom menu bar
    @IBOutlet weak var cameraButton: UIButton!
    @IBOutlet weak var redoButton: UIButton!
    @IBOutlet weak var saveButton: UIButton!
    @IBOutlet weak var shareButton: UIButton!
    @IBOutlet weak var overLay: UIImageView!



    // this function lets the statusbar disappear
    override func prefersStatusBarHidden() -> Bool {
        return true
    }



    override func viewDidLoad() {
        super.viewDidLoad()
        overLay.image = nil
          // variables for accessing web images
    let url = NSURL(string: "http://www.fteunen.com/app/overLay.png")
   let urlRequest = NSURLRequest(URL: url!)
        NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue(), completionHandler: {
            response, data, error in

            if error != nil {

              println("Something happened i guess, not good!!")
            } else {
               //let image = UIImage(data: data)
                self.overLay.image = UIImage(data: data)
            }

        })

    }

    override func viewDidLayoutSubviews() {
 //code
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func didTakePhoto(sender: AnyObject) {
//code      
        })

    }

    override func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?) {
        dismissViewControllerAnimated(true) {
            // Optional completion handler code here
        }
    }
    @IBAction func redoPicture(sender: AnyObject) {
        // code
        })

    }

您正在泄漏内存,因为您正在不断创建新的视图控制器,这些视图控制器本质上都是相互叠加并下载图像。 您应该执行segue,然后关闭该视图控制器以返回到先前的视图控制器。 在您要尝试回到第一个控制器的第二个视图控制器中,通过以下两种方式之一调用dismissViewControllerAnimated

dismissViewControllerAnimated(true, completion: nil)

要么:

dismissViewControllerAnimated(true) {
    // Optional completion handler code here        
}

由于不断在VC之上创建新的VC而导致内存泄漏

使用展开。

在MainViewController中

@IBAction unwindSegue(segue: UIStoryboardSegue, sender: UIStoryboardSegue){//any code you want executed upon return to mainVC}

在NewViewController中

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){//pass any information from New to Main here}

然后,在NewVC中,只需从要导致展开的UIButton上按住Control键并拖动到NewVC的Exit符号,然后选择unwindSegue

*

*

注意:另外,如果您希望通过编程而不是通过Button进行展开。 按住Control键并从NewVC中拖动(黄色按钮)退出(红色橙色按钮) 在此处输入图片说明 ,这将在“退出”下创建一个轻松的搜索。 选择此“ Unwind segue”,然后在属性检查器中为其指定一个标识符。 在此处输入图片说明

现在在NewVC中创建一个函数

func NameYourFunc(){performSegueWithIdentifier("TheIdentiferYouUsed", sender: self)}

以及想要执行此展开操作时在NewVC代码中的任何位置,只需调用NameYourFunc()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM