Приложение IOS убито из-за нехватки памяти, но не получено предупреждение о памяти - PullRequest
7 голосов
/ 09 декабря 2011

Я застрял с проблемой в течение некоторого времени, и я хотел бы знать, может ли кто-нибудь помочь. Я разрабатываю приложение IOS (iPad) с использованием основного контроллера навигации и большого количества UIImage. После использования приложения в течение некоторого времени его убивают из-за нехватки памяти (не в определенном представлении), но, проверяя журнал iPad, я не всегда вижу предупреждение о нехватке памяти (иногда я вижу, иногда нет). Даже когда я получаю один, это просто " Предупреждение о низком объеме памяти ", но я никогда не получаю " Уровень 1 " или " Уровень 2 ".

При использовании инструмента Leak из xCode я не смог найти никаких утечек.

Может кто-нибудь помочь?

Ответы [ 2 ]

10 голосов
/ 09 декабря 2011

Предупреждение о памяти отправляется как уведомление, поэтому оно будет поставлено в очередь на цикле выполнения для отправки, как только появится такая возможность.Если бы вы написали (намеренно прерванный) цикл, например:

while(1)
{
    NSString *newString = [NSString string];
}

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

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

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

while(1)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *newString = [NSString string];
    [pool drain]; // stylistically preferred to release, but equivalent
                  // in reference counted environments
}

Будет продолжаться вечно, но никогда не вызовет состояние нехватки памяти.

5 голосов
/ 29 августа 2013

Вы также можете попробовать утечку памяти, среда разработки Apple Xcode предоставляет инструменты для обнаружения утечки памяти, самый простой способ запустить ее - прямо с

Xcode: 1.Product -> 2. Начните с производительностиИнструмент (Профилировщик) -> 3. Из инструмента выберите Утечки.

Кажется, он очень хорошо обнаруживает утечки памяти, и его легко понять.

...