Может кто-нибудь мне помочь? мое приложение вылетает при прохождении, у меня был отключен NSZombies, и у меня также был этот код

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
}

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

Заранее спасибо

3
user2641085 3 Июл 2014 в 10:36
АРК? или стандартный способ управления памятью?
 – 
Apurv
3 Июл 2014 в 10:40
Пожалуйста, покажите полный журнал ошибок. Вы можете сделать снимок экрана
 – 
Tony
3 Июл 2014 в 10:41
Я пока не могу загружать сюда картинки, поэтому вот ссылка picpaste.com/pics/…
 – 
user2641085
3 Июл 2014 в 11:03
 – 
Andrew
22 Авг 2014 в 00:02

3 ответа

Лучший ответ

Я каким-то образом нашел способ увеличить использование памяти, мне просто нужно выполнить removeAllCachedResponses для каждого viewDidLoad ViewControllers, потому что didReceiveMemoryWarning был довольно поздно или откладывался для очистки кешированных ответов при срабатывании предупреждения о памяти, это может не выглядеть хорошо в коде, но это мешает хранить и пополнять память и кеши. Я все еще не могу назвать это решением, но это каким-то образом эффективный превентивный метод предотвращения утечки памяти.

0
user2641085 7 Июл 2014 в 07:58
1
В обычных случаях вызов removeAllCachedResponses не требуется. Используйте инструменты для проверки утечек.
 – 
Raptor
23 Дек 2014 в 09:31

На скриншоте видно несколько ошибок:

  1. Приложение было убито системой, потому что вы выделяете слишком много памяти.

    Использование памяти 261.4MB - это слишком много! Вы говорите, что загружаете локальные изображения. Убедитесь, что эти изображения как можно меньше (в пикселях) и хранятся в памяти только до тех пор, пока они необходимы для текущего просмотра. Здесь много дискуссий о том, как это сделать. Если вы не нашли решения, опубликуйте новый вопрос со своим кодом, указав, сколько изображений и их размер в пикселях, используете ли вы ARC или нет, а также что вы пытались это исправить. . Используйте инструмент Allocations Instruments из Xcode, чтобы узнать, где в вашем коде вы выделяете слишком много памяти.

  2. Журнал консоли показывает множество проблем с ограничениями автоматического размещения.

    Это тоже следует исправить. Задайте новый вопрос с более подробной информацией о такой проблеме, если вы не можете ее исправить. Здесь также много дискуссий по таким вопросам, которые должны помочь. Воспользуйтесь функцией поиска на этом сайте!

3
Kerni 3 Июл 2014 в 15:06
Примечание: +[UIImage imageNamed:] кэширует каждое изображение, которое он вам дает, и не сбрасывает предупреждение о памяти, поэтому вы можете сломать тонну памяти, если у вас много изображений, даже если вы используете только одно или несколько в время.
 – 
Kevin
3 Июл 2014 в 18:12
Я решил все проблемы с автомакетом, в журналах больше нет предупреждений, но приложение по-прежнему использует много памяти, у меня есть изображения размером 800 x 600, должен ли я по-прежнему делать для них низкое разрешение? или каковы рекомендуемые размеры, чтобы изображение не было пикселизированным при просмотре на iPad?
 – 
user2641085
4 Июл 2014 в 13:49
Пожалуйста, следуйте ответу из пункта 1 в моем ответе. Если вы не знаете, что именно использует память, которая не освобождается, никто не сможет дать вам правильный ответ. В целом: размер 800x600 не должен быть проблемой, если только у вас одновременно не хранится много изображений в памяти.
 – 
Kerni
4 Июл 2014 в 14:09

Когда вы закончите с выделенными объектами, явно установите для них значение nil, чтобы освободить память.

Даже если вы используете ARC, это ускорит очистку.

0
Castro Kitchner 3 Июл 2014 в 15:17