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

Я создаю приложение для просмотра фотографий, которые я опускаю из 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

Это мои ассигнования / виртуальный инструмент вплоть до крушения

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

2 ответа

Решение

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

    _image = nil;
    _imageThumbnail = nil;

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

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