Когда контроллер представления уволен, он должен очистить память?

Я хотел бы узнать об управлении памятью в Objective-C, что мне не так просто, потому что я довольно новичок в Objective-C и ARC, и я в основном привык к языкам сценариев, для которых мне не приходится иметь дело с этим много (или не совсем) с управлением памятью.

Приложение, над которым я работаю, представляет viewController (с приложенным xib-файлом) из кода после нажатия кнопки. В этом контроллере представлений у меня есть несколько представлений; Я записываю последовательность изображений (фотографии с камеры, сохраненные на диск), которые я конвертирую в фильм, и у меня есть GPS-трекер (mapKit), который отображает небольшую карту на экране. После того, как все сделано, я могу нажать кнопку "Готово", которая вызывает [self dismissViewControllerAnimated:YES completion:nil];

ViewController возвращается к моему rootViewController и потому что NSLog сообщение внутри dealloc метод в viewController, который увольняется, я могу подтвердить, что этот viewController освобождается.

Проблема в том, что после использования приложения я вижу увеличение памяти (использование состоит в том, чтобы делать снимки и записывать местоположения GPS на карте MapKit, а также создавать файл фильма) примерно до 80 МБ, а при нажатии - до 70 МБ. "Готово", так что viewController закрывается, и приложение возвращается к моему rootViewController. Я могу снова представить тот же viewController, использовать его и отклонить, и приложение все равно будет занимать около 70 МБ памяти, которая не падает. Это на самом деле не выглядит для меня утечкой памяти, потому что в этом случае я бы ожидал неуклонного увеличения памяти с каждым созданием экземпляра и удалением viewController. Это не так, даже если у меня есть разные кнопки в моем rootViewController, которые все создают новый и уникальный экземпляр моего класса viewController.

Мне интересно: есть ли что-то, что я должен искать, или это ожидаемое поведение? Может быть, приложение кэширует классы для будущего использования? Если управление памятью выполнено правильно, следует ли ожидать, что приложение вернется в "первичное" состояние памяти (в данном случае это будет около 4 МБ) после закрытия единственного представленного viewController?

2 ответа

Решение

Если вы видите увеличение памяти в Xcode, а не при использовании инструментов, ответ, который я придумал, заключается в этом ответе.

Вы можете прочитать весь ответ, это довольно подробно. Короче говоря, в XCode вы видите объем памяти, который ОС "отдала" вашему приложению для использования. Это будет увеличиваться каждый раз, когда ваше приложение пытается выделить что-то. Он не уменьшается так быстро, потому что операционная система догадывается, думая, что вашему приложению может понадобиться больше памяти в будущем. Операционная система быстрее оставляет эту память "отданной" вашему приложению, чем забирает ее и возвращает позже.

Контроллер представления должен быть удален из памяти, когда он не используется другими объектами (или не имеет прочных связей с другими вашими объектами, которые еще не удалены из памяти).

Ex.

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")
                }
            }
        }
    }
}

Допустим, вы впервые представили secondViewController, используя сеанс раскадровки, и сохранили его в своем экземпляре ViewController как свойство. Затем вы закрываете secondViewController и снова представляете secondViewController из ViewController. Он выведет "Еще есть экземпляр второго контроллера представления", так как тот, который вы представили ранее, все еще использовался ViewController.

Тем не менее, когда secondViewController имеет слабое соединение, (weak var secondViewController: SecondViewController), он никогда не будет печататься, так как с момента закрытия secondViewController он будет удален из памяти, а secondViewController будет равен нулю.

РЕДАКТИРОВАТЬ:

Примечание: результат должен быть одинаковым при использовании Objective-C.

Другие вопросы по тегам