当视图控制器被关闭时,它应该清空内存吗?
When a view controller is dismissed, should it empty the memory?
我想了解 Objective-C 中的内存管理,但我发现这并不容易,因为我在 Objective-C 和 ARC 方面还很陌生,而且我主要用于编写脚本语言我不必处理那么多(或根本不需要)内存管理。
我正在开发的应用程序在按下按钮后从代码中显示 viewController(附有 xib 文件)。在这个视图控制器中,我实例化了几个视图;我记录了一系列图像(来自相机的照片,保存到磁盘),我将其转换为电影,并且我有一个 gps 跟踪器(mapKit),它在屏幕上显示了一个小地图。完成所有操作后,我可以按下 'done' 按钮调用 [self dismissViewControllerAnimated:YES completion:nil];
viewController 动画回到我的 rootViewController,因为我在 viewController 的 dealloc
方法中放置了一条 NSLog
消息,我可以确认这个 viewController 正在被释放。
问题是我看到内存在使用应用程序(使用包括在 MapKit 地图上拍照和记录 gps 位置以及生成电影文件)后增加到大约 80 MB,然后下降到当我按 'done' 时大约 70MB,因此 viewController 消失并且应用程序 returns 到我的 rootViewController。我可以再次呈现相同的 viewController,使用它并关闭它,应用程序仍会占用大约 70MB 的内存,不会下降。在我看来,这并不是真正的内存泄漏,因为在那种情况下,我希望 viewController 的每次实例化和解雇都会稳定增加内存。情况并非如此,即使我的 rootViewController 中有不同的按钮,它们都实例化了我的 viewController class.
的一个新的唯一实例
我想知道:是否有我应该寻找的东西或者这是预期的行为?也许该应用正在缓存 classes 以备将来使用?正确完成内存管理后,我是否应该期望应用程序在关闭唯一的 viewController 后恢复到 'virgin' 内存状态(在本例中约为 4 MB)?
当视图控制器未被其他对象使用时(或者与尚未从内存中删除的其他对象没有强连接),应将其从内存中清除。
例如
class ViewController: UIViewController {
var secondViewController: SecondViewController?
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let identifier = segue.identifier {
if identifier == "second" {
if secondViewController == nil {
secondViewController = segue.destinationViewController as? SecondViewController
} else {
println("There's still an instance of second view controller")
}
}
}
}
}
假设您第一次使用故事板转场呈现第二个ViewController,并将其作为属性 存储在您的ViewController 实例中。然后,您关闭第二个 ViewController,并再次呈现 ViewController 中的第二个 ViewController,它将打印 "There's still an instance of second view controller",因为您之前呈现的那个仍在被 [= 使用28=].
然而,当 secondViewController 有弱连接时,(weak var secondViewController: SecondViewController
),它永远不会打印,因为从 secondViewController 被解雇的那一刻起,它就会被删除来自内存,secondViewController 将为 nil。
编辑:
注意:使用Objective-C时结果应该相同。
如果您在 Xcode 中看到这种内存增加,而不是在使用仪器时,那么 the answer I have come up with is in this answer.
您可以阅读整个答案,非常有深度。但长话短说,在 Xcode 中,您会看到 OS 有 "given" 供您的应用程序使用的内存量。每当您的应用尝试分配某些东西时,这都会增加。它不会减少得那么快,因为 OS 会猜测您的应用程序将来可能需要更多内存。 OS 将该内存 "given" 留给您的应用程序比将其拿走并稍后归还更快。
我想了解 Objective-C 中的内存管理,但我发现这并不容易,因为我在 Objective-C 和 ARC 方面还很陌生,而且我主要用于编写脚本语言我不必处理那么多(或根本不需要)内存管理。
我正在开发的应用程序在按下按钮后从代码中显示 viewController(附有 xib 文件)。在这个视图控制器中,我实例化了几个视图;我记录了一系列图像(来自相机的照片,保存到磁盘),我将其转换为电影,并且我有一个 gps 跟踪器(mapKit),它在屏幕上显示了一个小地图。完成所有操作后,我可以按下 'done' 按钮调用 [self dismissViewControllerAnimated:YES completion:nil];
viewController 动画回到我的 rootViewController,因为我在 viewController 的 dealloc
方法中放置了一条 NSLog
消息,我可以确认这个 viewController 正在被释放。
问题是我看到内存在使用应用程序(使用包括在 MapKit 地图上拍照和记录 gps 位置以及生成电影文件)后增加到大约 80 MB,然后下降到当我按 'done' 时大约 70MB,因此 viewController 消失并且应用程序 returns 到我的 rootViewController。我可以再次呈现相同的 viewController,使用它并关闭它,应用程序仍会占用大约 70MB 的内存,不会下降。在我看来,这并不是真正的内存泄漏,因为在那种情况下,我希望 viewController 的每次实例化和解雇都会稳定增加内存。情况并非如此,即使我的 rootViewController 中有不同的按钮,它们都实例化了我的 viewController class.
的一个新的唯一实例我想知道:是否有我应该寻找的东西或者这是预期的行为?也许该应用正在缓存 classes 以备将来使用?正确完成内存管理后,我是否应该期望应用程序在关闭唯一的 viewController 后恢复到 'virgin' 内存状态(在本例中约为 4 MB)?
当视图控制器未被其他对象使用时(或者与尚未从内存中删除的其他对象没有强连接),应将其从内存中清除。
例如
class ViewController: UIViewController {
var secondViewController: SecondViewController?
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let identifier = segue.identifier {
if identifier == "second" {
if secondViewController == nil {
secondViewController = segue.destinationViewController as? SecondViewController
} else {
println("There's still an instance of second view controller")
}
}
}
}
}
假设您第一次使用故事板转场呈现第二个ViewController,并将其作为属性 存储在您的ViewController 实例中。然后,您关闭第二个 ViewController,并再次呈现 ViewController 中的第二个 ViewController,它将打印 "There's still an instance of second view controller",因为您之前呈现的那个仍在被 [= 使用28=].
然而,当 secondViewController 有弱连接时,(weak var secondViewController: SecondViewController
),它永远不会打印,因为从 secondViewController 被解雇的那一刻起,它就会被删除来自内存,secondViewController 将为 nil。
编辑:
注意:使用Objective-C时结果应该相同。
如果您在 Xcode 中看到这种内存增加,而不是在使用仪器时,那么 the answer I have come up with is in this answer.
您可以阅读整个答案,非常有深度。但长话短说,在 Xcode 中,您会看到 OS 有 "given" 供您的应用程序使用的内存量。每当您的应用尝试分配某些东西时,这都会增加。它不会减少得那么快,因为 OS 会猜测您的应用程序将来可能需要更多内存。 OS 将该内存 "given" 留给您的应用程序比将其拿走并稍后归还更快。