Освобождение выделений в ответ на предупреждение о нехватке памяти, но приложение по-прежнему падает - PullRequest
3 голосов
/ 06 октября 2011

Я создаю приложение для просмотра фотографий, которые я опускаю из API. Размер каждой фотографии ~ 1 МБ. Я установил «слайд-шоу», чтобы показать фотографию, а затем перейти к следующей, как пользователь на самом деле будет использовать приложение. Я тестирую на iPad 1 в инструментах.

Когда мое приложение получает предупреждение о нехватке памяти, я сбрасываю все фотографии, которые в данный момент не отображаются пользователю, а также все кэшированные данные модели, возвращенные из API. Я наблюдаю значительное сокращение своих распределений в инструментах и ​​такое же снижение использования виртуальной памяти. Даже с таким падением потребляемой памяти мое приложение все еще убивается ОС.

Приложение реагирует на 2-3 предупреждения памяти без сбоев перед завершением.

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

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
    NSLog(@"Received memory warning; clear image for photo named \"%@\"", _name);
        _image = nil;
        _imageThumbnail = nil;
}];

Который вызывается. У меня также есть NSMutableDictionary, который я вызываю removeAllObjects, когда я получил предупреждение о нехватке памяти. Я получаю следующее в консоли устройства:

Oct  5 19:43:46 unknown configd[25] <Notice>: jetsam: kernel termination snapshot being created
Oct  5 19:43:46 unknown com.apple.launchd[1] <Notice>: (com.apple.accessoryd) Exited: Killed: 9
Oct  5 19:43:46 unknown com.apple.launchd[1] <Notice>: (com.apple.locationd) Exited: Killed: 9
Oct  5 19:43:46 unknown com.apple.launchd[1] <Notice>: (com.apple.mediaserverd) Exited: Killed: 9
Oct  5 19:43:46 unknown com.apple.launchd[1] <Notice>: (UIKitApplication:com.500px[0xd492]) Exited: Killed: 9
Oct  5 19:43:47 unknown kernel[0] <Debug>: launchd[1996] Builtin profile: accessoryd (sandbox)
Oct  5 19:43:47 unknown ReportCrash[1999] <Error>: libMobileGestalt loadBasebandMobileEquipmentInfo: CommCenter error: 1:45
Oct  5 19:43:47 unknown ReportCrash[1999] <Error>: libMobileGestalt copyInternationalMobileEquipmentIdentity: Could not get mobile equipment info dictionary
Oct  5 19:43:47 unknown ReportCrash[1999] <Error>: Saved crashreport to /Library/Logs/CrashReporter/LowMemory-2011-10-05-194347.plist using uid: 0 gid: 0, synthetic_euid: 0 egid: 0
Oct  5 19:43:47 unknown DTMobileIS[1655] <Warning>: _memoryNotification : <NSThread: 0x1cd31410>{name = (null), num = 1}
Oct  5 19:43:47 unknown DTMobileIS[1655] <Warning>: _memoryNotification : {
        OSMemoryNotificationLevel = 0;
        timestamp = "2011-10-05 23:43:47 +0000";
    }
Oct  5 19:43:47 unknown DTMobileIS[1655] <Warning>: _memoryNotification : <NSThread: 0x1cd31410>{name = (null), num = 1}
Oct  5 19:43:47 unknown DTMobileIS[1655] <Warning>: _memoryNotification : {
        OSMemoryNotificationLevel = 0;
        timestamp = "2011-10-05 23:43:47 +0000";
    }
Oct  5 19:43:48 unknown com.apple.locationd[1997] <Notice>: locationd was started after an unclean shutdown
Oct  5 19:43:49 unknown SpringBoard[29] <Warning>: Application '500px' exited abnormally with signal 9: Killed: 9

This is my allocations/VM instrument up until the crash.

Кто-нибудь знает, почему мое приложение убивают, хотя оно освобождает память?

Ответы [ 2 ]

3 голосов
/ 06 октября 2011
    _image = nil;
    _imageThumbnail = nil;

Это просто установка указателей на nil, а не освобождение реальных объектов. Освободите объекты, затем они будут освобождены (если их количество попаданий достигнет 0).

Поскольку вы используете ARC, просто установите для свойств значение nil.

1 голос
/ 06 октября 2011

Оказывается, я цеплялся за ссылки на классы моделей где-то еще - они не получали dealloc'd, даже если они выпускали свои данные изображения во время предупреждений памяти.В конце концов их стало слишком много, и приложение упало.

...