【问题标题】:Xcode 9: Getting More Information On Memory LeakXcode 9:获取有关内存泄漏的更多信息
【发布时间】:2019-01-30 10:15:45
【问题描述】:

在得知内存泄漏可能是我的 iOS 应用在安装到手机上数小时后崩溃的原因后,我观看并阅读了有关内存泄漏的视频/文章,特别是在 Xcode 中以及如何调试它们。我一直在尝试使用内存调试器和 Xcode 泄漏工具,但没有成功。我想知道,我如何找到泄漏的来源?我附上的屏幕截图显示了许多泄漏之一,它永远不会让我比图片显示的更深入。在视频中,Xcode 使用回溯将它们带到导致问题的代码行,但是在任何情况下我都无法做到这一点。我也注意到泄漏来自 UIKIT,这正常吗?感谢任何帮助,因为我是 Xcode 的新手。

Here is the image.

这是我最初登录视图控制器的一些代码。在第二张图片中,您会看到唯一存在内存泄漏的视图是这个,但是 - 我也无法深入挖掘。 Second image of memory leak from InitialLogInVC

import UIKit

class IntialLoginInViewController: UIViewController {
    @IBOutlet weak var backgroundAlbumArt: UIImageView!
    @IBOutlet weak var foregroundAlbumArt: UIImageView!
    @IBOutlet weak var musicNameLabel: UILabel!
    private weak var imageOne = UIImage(named: "taste.jpg")
    private weak var imageTwo = UIImage(named: "NavReckless.jpg")
    private weak var imageThree = UIImage(named: "watch.jpg")
    private weak var imageFour = UIImage(named: "juicewrld.jpg")

    lazy var imageInformation = [(name:"Taste - Tyga", image:imageOne),(name:"Reckless - Nav", image: imageTwo),(name:"Watch - Travis Scott", image: imageThree), (name:"Goodbye & Good Riddance - Juice Wrld", image: imageFour)]
    private var currentIndex = 0
    static var spotifySession: AnyObject?

    override func viewDidLoad() {
        super.viewDidLoad()
        foregroundAlbumArt.image = imageOne
        backgroundAlbumArt.image = imageOne
        musicNameLabel.text = imageInformation[0].name
        let _ = Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(imageRefresh), userInfo: nil, repeats: true)
    }

    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }

    @objc func imageRefresh(){
        if currentIndex == imageInformation.count - 1 {
            currentIndex = 0
        }
        else {
            currentIndex += 1
        }
        //Update Label
        UIView.transition(with: self.musicNameLabel, duration: 2.0, options: [.transitionCrossDissolve] , animations: {
            self.musicNameLabel.text = self.imageInformation[self.currentIndex].name

        }, completion: nil)
        //Update foreground Album
        UIView.transition(with: self.foregroundAlbumArt, duration: 2.0, options: [.transitionCrossDissolve] , animations: {
            self.foregroundAlbumArt.image = self.imageInformation[self.currentIndex].image
        }, completion: nil)
        //Update background Album

        UIView.transition(with: self.backgroundAlbumArt, duration: 2.0, options: [.transitionCrossDissolve] , animations: {
            self.backgroundAlbumArt.image = self.imageInformation[self.currentIndex].image
        }, completion: nil)

    }

}

【问题讨论】:

  • 如果您知道哪个控制器或视图导致泄漏,您可以发布一些代码,我们可以检查.. 到目前为止,这似乎是一个故事板问题
  • @Brandon 我已经从视图控制器的初始登录中添加了代码。如果这是原因,我不是 100%,但它是出现在内存泄漏警告中的唯一视图。
  • 您正在泄漏一个Timer.. 它保留了self 又名目标。您需要保留对它的引用,并在 viewWillDisappear 中调用 timerReference.invalidate()。除此之外,我没有看到任何泄漏。

标签: ios swift xcode memory-leaks


【解决方案1】:

试试这个

    //Update Label
    UIView.transition(with: self.musicNameLabel, duration: 2.0, options: [.transitionCrossDissolve] , animations: { [weak self] in
        guard let `self` = self else { return }
        self.musicNameLabel.text = self.imageInformation[self.currentIndex].name

    }, completion: nil)

    //Update foreground Album
    UIView.transition(with: self.foregroundAlbumArt, duration: 2.0, options: [.transitionCrossDissolve] , animations: { [weak self] in
        guard let `self` = self else { return }
        self.foregroundAlbumArt.image = self.imageInformation[self.currentIndex].image
    }, completion: nil)
    //Update background Album

    UIView.transition(with: self.backgroundAlbumArt, duration: 2.0, options: [.transitionCrossDissolve] , animations: { [weak self] in
        guard let `self` = self else { return }
        self.backgroundAlbumArt.image = self.imageInformation[self.currentIndex].image
    }, completion: nil)

【讨论】:

  • 这成功了!我相信这一点以及布兰登的建议解决了我的问题。你对我可以在哪里学习何时在我的代码中使用 [weak self] 有什么建议吗?感谢您的帮助。
  • 您可以查看这篇文章:medium.com/anysuggestion/…,很高兴为您提供帮助;)
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2012-01-02
  • 2016-04-02
  • 2011-11-06
相关资源
最近更新 更多