iOS: ARC, не освобождает память - PullRequest
1 голос
/ 29 февраля 2012

У меня какая-то странная проблема с моим приложением для iOS.Через некоторое время моему приложению становится мало памяти, поэтому предупреждение о предупреждении памяти кажется нормальным, но когда я проверил использование памяти, я заметил, что все вызовы viewDidUnload не освобождают много памяти, поэтому после нескольких щелчков мышьюприложение, оно снова отправляется с предупреждением о памяти, все, кажется, снова в порядке, но не так много памяти было освобождено, поэтому он снова отправляется с предупреждением о памяти быстрее, а затем происходит сбой (после третьего предупреждения памяти в большинстве случаев),этот сбой является случайным: приложение зависает, приложение уходит, мой отладчик говорит, что приложение приостановлено, но нет плохого доступа или сигборта, нет зомби.Я предполагаю, что предупреждение памяти не может освободить достаточно памяти, как должно.

(я проверил все мои viewDidUnload и установил nil для каждого объекта, выделенного в viewDidLoad)

Любая помощь будет полезной!

большое спасибо.

Ответы [ 3 ]

8 голосов
/ 02 апреля 2012

Итак, мне удалось поработать с моей проблемой.

Я написал метод "- (void) dealloc" во всех моих контроллерах и проверил, могу ли я войти в него, как должен.(на поп-контроллере, увольнении и т.время, когда это было какое-то свойство, которое не было в делегате «unsafe_unretained», который был в «ASSIGN» (и не должен быть в назначении, но в unsafe_unretained) (наследие от проекта не-ARC ...)

Я такжеимел какой-то странный контроллер с XIB, который не был освобожден, даже если он пуст.Я перестраиваю новый шаг за шагом с копированием / вставкой и, наконец, с точно таким же кодом, новый контроллер был выпущен, без видимой разницы между ними !!!gnneee

по крайней мере, теперь я знаю, как отлаживать подобные проблемы ...

6 голосов
/ 29 февраля 2012

Я не думаю, что есть какой-либо способ дать конкретный ответ без дополнительных данных, поэтому лучшее, что я могу сделать, - это предложить вам перестать гадать, что может происходить с вашим приложением, и научиться измерять то, что на самом деле происходит. Запустите ваше приложение в разделе «Инструменты», и вы сможете проверить наличие утечек, а также увидеть, какие классы отвечают за большую часть памяти вашего приложения.

Вы должны убедиться, что вы знаете, как использовать как инструмент «Утечки» для идентификации утекшего объекта, так и инструмент «Распределения» для определения потерянных (но не утекших) наборов объектов, которые должны были быть освобождены, или просто случаев, когда ваше приложение не отвечает в память предупреждений, как вы ожидали.

https://developer.apple.com/library/ios/#documentation/developertools/conceptual/InstrumentsUserGuide/AboutTracing/AboutTracing.html может быть хорошим местом для начала, а также есть ряд учебных пособий; http://www.raywenderlich.com/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutorial и http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/ - одни из первых результатов, которые я увидел.

0 голосов
/ 01 марта 2012

Василий,

Во-первых, если вы сами не освобождаете дополнительную память, предупреждение -didReceiveMemory вам не поможет, и ОС будет продолжать запрашивать память, пока вас не убьют.Это звучит так, как будто это ваша проблема.

Во-вторых, если это не проблема, вы, вероятно, получаете прерывание из-за размера ваших разделов резидентной памяти.Удостоверьтесь, что вы смотрите на свое распределение VM в Инструментах.Я ожидаю, что MALLOC_TINY или MALLOC_SMALL имеют резидентные и грязные места размером более 5 МБ.Из-за характера небольших распределений эти области виртуальных машин никогда не будут сокращаться.Единственный вариант, который у вас есть, - это не создавать много мелких предметов.Это действительно только то, что вы можете решить, изменив алгоритмы вашего кода, чтобы использовать меньше памяти.

Эндрю

...