Подтвердить что ты не робот

IOS Low Memory Crash, но очень низкая память

Это раздражало меня в течение долгого времени. Мое приложение работает, занимая около 2,74 МБ памяти. Это здорово. Но тогда, когда он создает UIWebView, он достигает около 5.87MB и продолжает крах. Таковы значения, данные в Live Bytes in Instruments во время работы на моем iPad 1-го поколения.

Нет журнала сбоев, который я могу найти. На консоли:

MyApp[1205] <Warning>: Received memory warning. Level=1
MyApp[1205] <Warning>: applicationDidReceiveMemoryWarning
SpringBoard[30] <Warning>: Received memory warning. Level=1
MobileMail[1199] <Warning>: Received memory warning. Level=1
configd[26] <Notice>: jetsam: kernel memory event (95), free: 428, active: 1853, inactive: 1011, purgeable: 338, wired: 15122
configd[26] <Notice>: jetsam: kernel termination snapshot being created
com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilemail[0x8966]) Exited: Killed: 9
com.apple.launchd[1] <Notice>: (UIKitApplication:com.MyApp.MyApp[0xdd4f]) Exited: Killed: 9
SpringBoard[30] <Warning>: Application 'Mail' exited abnormally with signal 9: Killed: 9
kernel[0] <Debug>: launchd[1207] Builtin profile: MobileMail (sandbox)
SpringBoard[30] <Warning>: Application 'MyApp' exited abnormally with signal 9: Killed: 9
configd[26] <Debug>: CaptiveNetworkSupport:UIAllowedNotifyCallback:70 uiallowed: false
ReportCrash[1206] <Error>: libMobileGestalt loadBasebandMobileEquipmentInfo: CommCenter error: 1:45
ReportCrash[1206] <Error>: libMobileGestalt copyInternationalMobileEquipmentIdentity: Could not get mobile equipment info dictionary
ReportCrash[1206] <Error>: Saved crashreport to /Library/Logs/CrashReporter/LowMemory-2011-05-12-160645.plist using uid: 0 gid: 0, synthetic_euid: 0 egid: 0

Я удалил все вызовы imageNamed, изменил файл с автореализацией, чтобы выделить/отпустить. Но я не могу понять, почему это происходит, и это сводит меня с ума.

Спасибо за любую помощь!

4b9b3361

Ответ 1

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

Не очевидно, что вам нужно сделать, чтобы узнать, что действительно использует ваше приложение, но как только вы это сделаете пару раз, вы запомните.

  • Запустите с помощью инструмента производительности Allocations.
  • Нажмите кнопку "Отслеживание VM" в разделе "Выделения" (на снимке экрана).
  • Нажмите "Автоматический снимок"

Затем вы увидите свою грязную память (на данный момент 20,34 МБ на моем снимке экрана).

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

Удачи!

This screenshot will help

Ответ 2

Мне нужно добавить две вещи, которые могут помочь:

  • Как упоминалось в предыдущем ответе , битмат UIImage не учитывается в объеме памяти. Утечки говорят вам, что ваше приложение использует! так что у вас может быть много UIImages, которые используют большую часть покупки памяти, а не покажутся в общей сумме. Моя рекомендация - использовать Allocations, чтобы проверить количество объектов UIImage, созданных и уничтоженных во время вашего приложения.
  • Как упоминалось в этом ответе используйте следующий код

    -(void) report_memory {
        struct task_basic_info info;
        mach_msg_type_number_t size = sizeof(info);
        kern_return_t kerr = task_info(mach_task_self(),
                                       TASK_BASIC_INFO,
                                       (task_info_t)&info,
                                       &size);
        if( kerr == KERN_SUCCESS ) {
            NSLog(@"Memory in use (in bytes): %u", info.resident_size);
        } else {
            NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
        }
    }
    

чтобы узнать объем памяти, которую операционная система назначила вашему приложению. Это более точное число в памяти, которую использует приложение. (Вам нужно будет #import "mach/mach.h" )

ура!

Ответ 3

Вы нажимаете эту кнопку меню 2 раза быстро, вы увидите приложение, щелкните по x для всех приложений, затем откройте те, которые вам нужны.