Примечание: Приносим извинения, если есть похожие вопросы, но они более специфичны, например, «Проблемы с утечкой памяти UIMapView Kit», меня больше беспокоит и действительно хочу знать в General Swift и ARC и управлении памятью Проблемы с ним.Swift UIKit Управление памятью неэффективность
Я сделал пару приложений сейчас в Xcode, однако все это было сделано в Objective-C.
Управление памятью объектов UIKit (включая UIViews и UIViewControllers) и любой другой объект в этом отношении прост в обращении в Objective-C, и я просто хочу привыкнуть к нему после битвы с ним в какой-то момент в Кривая обучения.
Теперь я работаю с Swift, пытаясь не отставать от технологии «Cutting-Edge». однако я заметил небольшую проблему с тем, что я смог зафиксировать и контролировать в Objective-C, Memory Management.
Свифт говорит, что нам будет легче сосредоточиться на разработке кода, а не на управлении памятью, как его предшественник или будущий предшественник. Однако я еще не нашел этого преимущества. У меня было ужасное время с управлением памятью моего нового приложения. Просто создание простого UIViewController с несколькими представлениями может складывать память, которая мне больше не нужна, за несколько Мб одновременно.
Имейте в виду, что я использовал деконструктор (Deinit in Swift), назначая nil значениям, которые мне больше не нужно использовать, удаляя SubViews из Super Views вручную, думая, что это проблема, даже используя сегмент кода AutoReleasePool.
autoreleasepool{
//Code looping through Swift Native Objects that potentially might lead to leaking
//But AutoReleasePool helps with this, supposedly.
}
Теперь вопрос: кто-нибудь здесь точно знает, в чем проблема? Это я делаю что-то ужасное с моим кодом? или действительно ли ошибка в Xcode и быстрое управление памятью? У кого-нибудь еще была эта проблема, вы ее решили?
Вот ссылка, объясняющая немного эту ситуацию. Problems of ARC in Swift? ARC in Swift Apple Docs
Обновление:
Вы правы, я должен разместить больше о моей ситуации: вот он идет.
У меня есть память, начинающаяся с ~ 5 мб, как только приложение запускается.
Как только я начну навигацию вокруг приложения. Я замечаю, как постепенно начинает складываться память. , но самый большой всплеск памяти начинает накапливаться, когда я использую UIMapView около 25+ Mbs.
При использовании только обычного UITableViewController он просто накапливает ~ 2 МБ каждый раз, когда я нажимаю (на NavController) тот же UITableViewController. Когда я вставляю этот TableViewCell, он открывает еще один ViewController с UIMapView, вот где память начинает накапливаться очень хорошо.
Rememeber Я просто иду туда и обратно, просматривая приложение. Всего всего 4 UIViewControllers, включая «Мое меню».
Но вот что ... Все эти снимки SnapShots, которые вы видите, после того, как я прекратил навигацию и вернусь в главное меню, Root ViewController моего контроллера навигации.
Впечатляющий отклик, Как вы уже сказали, я добавил больше Контекст к моей конкретной ситуации. И спасибо за это про GC. Я действительно не знал этого о WWDC и о том, как они решили не держать его из-за мнения Дэвса. –
Итак, я продолжал тестировать и отлаживать и использовать инструменты, как вы предлагали. Мне удалось уменьшить объем памяти в куче примерно до ~ 1 мб за действия и вернуться в начальное состояние приложения. Но мне интересно, нормально ли это, хотя в нескольких статьях говорится, что он должен вернуться к 0mb Growth после того, как каждое действие, предполагающее, что ничего не сохраняется, что имеет смысл для меня. Но я до сих пор этого не понимаю, я думал, что Swift будет немного проще для разработчиков и управления памятью, но похоже, что он похож на Obj-C. –
Вы должны увидеть почти нулевой рост за каждое действие. Во время запуска, конечно, вы увидите рост по мере того, как вы выделяете память, но это должно успокоиться довольно быстро, и просто навигация не должна приводить к росту памяти в правильной программе. Исторически были небольшие утечки внутри UIKit, которые вы не можете устранить, но, конечно, ничего подобного 1MB за действие. Если вы можете многократно расти так много, у вас все еще есть ошибки. Управление быстрой памятью идентично современному управлению памятью ObjC (ARC). –