【发布时间】:2019-01-30 10:15:45
【问题描述】:
在得知内存泄漏可能是我的 iOS 应用在安装到手机上数小时后崩溃的原因后,我观看并阅读了有关内存泄漏的视频/文章,特别是在 Xcode 中以及如何调试它们。我一直在尝试使用内存调试器和 Xcode 泄漏工具,但没有成功。我想知道,我如何找到泄漏的来源?我附上的屏幕截图显示了许多泄漏之一,它永远不会让我比图片显示的更深入。在视频中,Xcode 使用回溯将它们带到导致问题的代码行,但是在任何情况下我都无法做到这一点。我也注意到泄漏来自 UIKIT,这正常吗?感谢任何帮助,因为我是 Xcode 的新手。
这是我最初登录视图控制器的一些代码。在第二张图片中,您会看到唯一存在内存泄漏的视图是这个,但是 - 我也无法深入挖掘。 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