2013-02-20 4 views
0

Я знаю, что этот вопрос задавался много раз, но я еще не нашел решение. Мое приложение проходит между представлениями в этом порядке a-> b-> c-> d-> b. Это означает, что из представления «d» я не всегда возвращаюсь, и вам нужно прыгать, чтобы просмотреть «b». Проблема в том, что память из представлений «c» и «d» не освобождается, а после некоторых циклов (b-> c-> d-> b-> c ....) приложение вылетает. Очень важно порядок операций. Я должен упомянуть, что я перемещаюсь между видами с помощью модального сегмента. Я попытался освободить память разными способами:Освобождение памяти в iOS 5 под дугой

  1. Ввод: DidRecieveMemoryWarning: _myProperty = nil;
  2. Ввод в ViewDidUnload: _myProperty = nil;
  3. Изменение всех свойств на слабых.
  4. Код упаковки с @autoreleasepool.

Ничего не помогло, приложение сработает через некоторое время, как можно освободить виды и память «силой»?

+2

Почему вы уверены, что авария связана с утечкой памяти? – Gereon

+0

Проверял его с монитором активности, всегда примерно до 420 МБ, из-за сбоя приложения, а не для его просмотра, и я получаю предупреждения о памяти. – Dim

+0

, когда какой-либо вид вытащил стек навигации, он будет выпущен автоматически, если вы используете 'ARC'. ситуация, которую вы описали в своем вопросе, никогда не случится, если вы не сохраните объекты как-то, то есть указатели хранятся в другом массиве, и они сохраняют их и т. д. – holex

ответ

1

ARC был изготовлен для того, чтобы не выпускать силой, позволяя ОС обрабатывать все выпуски. Вы должны использовать xcode tools, чтобы узнать, сколько памяти используется вашим приложением. Мне кажется, что вы раздуваете память, поэтому вам лучше проверить, сколько памяти используется и что вы можете сделать, чтобы оптимизировать ее, чтобы ресурсы распределения оставались в приемлемых пределах. (например, загрузка 1000 изображений в представлении, где каждое изображение имеет размер 1 Мб, является общим количеством отходов и, вероятно, приведет к такому сбою. Этот пример намеренно преувеличен, поэтому вы получите идею)

+0

Я много раз его щекочул, настолько тривиальным, что я даже не упоминал об этом, как это связано с моим вопросом? Если вы хотите знать, я тестирую iPad 2. В представлении b мое приложение использует примерно 220 Мбайт, на C 250MB, на его 260 Мбайт, затем он снова переходит в b и добавляет память в сумме 320 МБ, после 3-4 петлям понравилось, что память составляет 430 МБ, и приложение падает. – Dim

+1

Мне нужно загрузить «1000 изображений в представлении, где каждое изображение 1 Мб», но я хочу, чтобы он был выпущен после выхода из представления. Вы мне не помогаете, вы просто описываете проблему под другим углом. – Dim

+0

Я не экстрасенс, так как я могу узнать, что вы его проверили ??? Мой ответ дал вам объяснение и возможный подход. И ваш вопрос сформулирован плохо, без соответствующего кода о том, как вы инициализируете или используете свои взгляды. Не ожидайте, что другие угадают, что вы делаете. – giorashc

0

Я также сталкиваюсь с этим проблема, но я писал приложение для какао для OSX10.8, а не iOS. Я обнаружил, что использование памяти приложения будет увеличиваться все время, когда я делаю что-то вроде отображения нового окна и закрытия снова и снова. Кажется, окно, которое я вижу, является новым каждый раз. 10MB-> 20MB-> 30MB ... Наконец, я дважды дважды щелкнул файл .app и снова проверил монитор активности. Дело в том, что это действительно стало нормальным. Приложение работает в режиме выпуска - это та же ситуация. Поэтому я полагаю, что ARC не будет выпускать память сразу в режиме отладки, если вы запускаете приложение через Xcode Run.

1

Объектив-C (в первую очередь) использует модель памяти подсчета. Существует ручная подсчет ссылок и автоматический подсчет ссылок (ARC).

Как ARC Работает

Если вы когда-либо работали с ручным подсчетом ссылок и запустить лязг инструмент статического анализатора, вы увидите, что он делает удивительную работу по поиску утечек памяти. Это идея ARC - если анализатор может так хорошо найти утечки, то почему бы не позволить ему выполнять управление памятью?

Итак, анализ выполняется во время компиляции, а полученный код обрабатывается с помощью вызовов сохранения и освобождения. Это основа ARC и отличная модель памяти, обеспечивающая хороший баланс между производительностью и простотой использования. Его особенно полезно в мобильных вычислениях, потому что, в отличие от сбора мусора, он не потребует дополнительных циклов процессора или разряда батареи.

(NB: ARC также вводит слабые ссылки, что является способом обнуления оборванных указателей во время выполнения).

Использование ARC не так просто, как сбор мусора - вам все равно нужно знать, как работает модель подсчета памяти. Возможны следующие проблемы.

Сохранил Циклы

Основной причиной утечки памяти является сохранение цикла. Здесь объект A имеет ссылку на объект B, а объект B имеет ссылку на объект A. Например, AirlineFlight содержит пассажира, а пассажир имеет утечку памяти AirlineFlight ->.

Это очень распространено в Какао. Другим примером является ViewController, который имеет представление, а View имеет делегат, который является ViewController. Звучит знакомо?

Чтобы избежать цикла удержания, необходимо, чтобы один из объектов не оставил другого. Наиболее распространенный подход - обозначить его как родителя, а другой - как ребенка. Родитель сохраняет дочерний элемент, но ребенок не сохраняет родителя. Пример:

Просмотр Контроллер

@interface MyViewController 

@property (nonatomic, strong) MyView* view 

@end 

Просмотр

@interface MyView 

@property (nonatomic, assign) MyViewController* controller 

@end 

Сохранять цикл теперь сломаны и утечка памяти больше не будет возникать. не

висячие указатели

Приведенный выше пример больше не имеет утечку памяти, но может привести к другой проблеме - висячие указатели. Контроллер вида может исчезнуть, в то время как представление все еще имеет ссылку на контроллер. Любой вызов контроллера приведет к сбою.

Там два пути, чтобы исправить это:

  1. Nil вне ссылку на контроллер в методе dealloc. , , но, вероятно, просто

  2. Используйте слабую ссылку, следующим образом:

    @property (nonatomic, weak) MyViewController* controller 
    

ИОС 5 и выше (или OSX 10.7) имеют небольшую утилиту выполнения, которая отслеживает оборванными указателей и Nils их для вас - это называется слабыми ссылками.

Поиск памяти Утечки

Есть несколько способов.

  • Используйте статический анализатор clang для определения циклов удержания.
  • Инструмент «Инструменты»
  • Мне нравится помещать операторы журнала в метод dealloc моих контроллеров и других классов ключей, чтобы обеспечить их освобождение.

Поиск висячие указатели

  • Compile с переменной окружения NS_ZOMBIES_ENABLED (или изменить схему в Xcode и установите флажок, который будет установлен этот параметр для вас).

Авто-релиз бассейны

Другая проблема, которая может произойти слишком много объектов, которые выделяются в течение выполнения цикла. , Чтобы исправить это, вы можете создать еще один пул автоматического выпуска в основном пуле.

@autoreleasepool 
{ 

} 

(В вашем случае, я не думаю, что это проблема).

0

Вы используете тяжелые png-изображения? Некоторое время назад у меня была такая же проблема, и изображение ширины ширины x использует высоту x ширину x 4 ОЗУ (поскольку она делится с GPU). Только мой фон потратил впустую 120 МБ. Если это так, попробуйте перенаправить ваши изображения.