iOS: Как определить утечку из инструментов Xcode?

я использовал профилировщик, чтобы искать утечки памяти и наткнулся на эту проблему:

enter image description here

я переключился на вызов дерева.

поэтому я мог бы нажать на него, чтобы узнать больше об этом:

enter image description here

но это не дает мне никакого представления. Откуда мне знать, что стало причиной утечки?

enter image description here

обновление:

  • дерево вызовов с системными библиотеками показано обновляется выше.
  • информация об объектах утечка:

enter image description here

  • некоторое описание того, что вы делаете в приложении, чтобы воспроизвести эту утечку:

наше приложение синхронизируется с нашим REST-API при запуске (на переднем плане) приложения. Это всегда работает на моем iOS 7 / iPhone 4S. Но другой разработчик имеет iOS7 / iPhone 5 и запускает seldomly в проблему, которую он не синхронизирует. После 10 дней наблюдений и сдачи NSLogs везде мы нашли это прошлой ночью:

Dec 15 03:18:58  appname[4801] <Warning>: A gateway to the host server is working via WWAN.
Dec 15 03:18:58  appname[4801] <Warning>: Syncing...
Dec 15 03:18:58  appname[4801] <Warning>: Eventname to be fired: f11-reachability
Dec 15 03:18:58  appname[4801] <Warning>: Sync event IOS_REACHABILITY reached.
Dec 15 03:18:58  appname[4801] <Warning>: Sync: IOS_SYNC_WITH_SERVER is true
Dec 15 03:18:58  appname[4801] <Warning>: Animating indicator...
Dec 15 03:18:58  appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate
Dec 15 03:19:27  com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilecal[0x45fb]) Exited: Killed: 9
Dec 15 03:19:27  com.apple.launchd[1] <Notice>: (com.apple.afcd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch.
Dec 15 03:19:27  com.apple.launchd[1] <Error>: (com.apple.afcd) assertion failed: 11B554a: launchd + 35697 [3C91C465-EFA6-32C7-A677-DD0B5FDEE0DC]: 0x9
Dec 15 03:19:27  com.apple.launchd[1] <Notice>: (com.apple.absd) Idle-exit job was jettisoned. Will bypass throttle interval for next on-demand launch.

третья попытка синхронизации (нажатие кнопки "Домой" и возвращение на передний план) дала нам это, что указывало на низкую память:

Dec 15 03:25:18 C1 appname[4801] <Warning>: Getting last timestamp: 1387003344.407783 then calling syncWithServerWithDate
Dec 15 03:25:29 C1 profiled[6244] <Notice>: (Note ) profiled: Service stopping.
Dec 15 03:25:40 C1 crash_mover[6248] <Notice>: (Warn ) <crash_mover.m mv_recursive:98> Moving './LowMemory-2013-12-14-160222.plist' -> '/var/mobile/Library/Logs/CrashReporter/LowMemory-2013-12-14-160222.plist'

поэтому я подумал, что дам профайлеру пойти и посмотреть, найду ли я что-нибудь.

чтобы воспроизвести его, я запустил приложение, пошел на главный экран, затем нажал Simulate a Low Memory а затем нажмите на приложение, чтобы вернуться на передний план. Вот где я получаю красное. пик.

  • какую версию Xcode вы используете.

Xcode 5.02. iOS 7.04 на iPhone 4S (OK), iPhone 5 (редкий край)

надеюсь, это поможет. Спасибо

1 ответов


как угрожающий, как появляется красный всплеск утечек, общая утечка памяти составляет 1,06 КБ, что крайне маловероятно, чтобы быть источником (и даже не связано с) вашей проблемой.

С точки зрения вашего приложения, приводящего к выбросу других приложений, это, само по себе, не проблема, и я бы меньше беспокоился об этом (хотя, чтобы быть хорошим гражданином, вы действительно должны попытаться минимизировать это). Более непосредственная функциональная проблема заключается в том, почему ваше приложение не синхронизируется и действительно ли это результат предупреждения памяти в самом приложении (или, точнее, сбой вашего приложения для достаточно свободных ресурсов в ответ на предупреждение памяти, что приводит к последующему распределению памяти для сбоя).

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

Dec 15 11:12:26 Robs-iPad myapp[2224] : Received memory warning.

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

я мог бы предложить вставить явный вход в делегат приложения:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    NSLog(@"%s", __FUNCTION__);

    // free whatever caches or other temporary resources you can here
}

или положить в специальную обработку в контроллере вида:

- (void)didReceiveMemoryWarning
{
    NSLog(@"%s", __FUNCTION__);

    [super didReceiveMemoryWarning];

    // do whatever you want to free resources here

    [[[UIAlertView alloc] initWithTitle:nil
                                message:@"didReceiveMemoryWarning"
                               delegate:nil
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil] show];
}

это приведет к тому, что в моей консоли появится следующее:

Dec 15 11:12:26 Robs-iPad myapp[2224] : -[AppDelegate applicationDidReceiveMemoryWarning:]
Dec 15 11:12:26 Robs-iPad myapp[2224] : -[ViewController didReceiveMemoryWarning]

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

но давайте предположим на секунду, что проблема действительно является результатом предупреждения памяти. Это приводит к двум вопросам: во-первых, что вы делаете для смягчения предупреждений памяти в первую очередь (например, используя @autoreleasepool для смягчения высокой отметки воды, не удерживая большой ресурс в памяти в то же время, если это не абсолютно необходимо, используя imageWithContentsOfFile, а не imageNamed)? Во-вторых, что вы делаете в ответ на предупреждения памяти (например, очищаете кэши и т. д.)?

Итак, если вы подтвердите, что предупреждение о памяти действительно является источником проблемы (и сделайте это первым), тогда может быть интересно посмотреть на график распределения во время процесса синхронизации (и подтвердить максимальное количество живых байтов, а также конечное количество живых байтов). Глядя на график распределения в вашем вопросе, это не выглядит слишком плохо (т. е. никаких диких колебаний), но опять же, вы не поделились с нами количеством "живых байтов", поэтому трудно сказать.

но я определенно не буду беспокоиться об этой утечке 1kb, когда вы имитируете предупреждение памяти. Это больше раздражает, чем любой серьезный симптом, о котором вам нужно беспокоиться. Следите за утечками, но сосредоточьтесь на (А) больших утечках; и (Б) тех, кто в вашем коде, а не в рамках.


мой первоначальный ответ, ниже, был в ответ на первоначальный вопрос, который был просто "что такое эта утечка, показанная инструментами, которые, похоже, не соответствуют моему код." Я буду держать его здесь для справки:


это может означать, что утечка не в вашем коде, а в системных фреймворках (которые вы скрыли).

вы можете поделиться:

  • дерево вызовов с системными библиотеками;

  • информация об объектах просочилась (так что, не только "дерево вызовов", но и список" утечки");

  • некоторое описание того, что вы сделать в приложении, чтобы воспроизвести эту утечку;

  • какие версии iOS вы видите, что эта проблема проявляется, и какие версии вы не делаете (фреймворки не без утечек, но это зависит от цели iOS); и

  • какую версию Xcode вы используете.

честно говоря, вы можете в конечном итоге игнорировать эту проблему, учитывая (а) незначительный размер утечки; (б) отсутствие указания на то, что проблема заключается в ваш код; и (c) тот факт, что фреймворки iOS имеют утечки вне вашего контроля. Но если вы обеспокоены, поделитесь некоторой из вышеуказанной информации, и мы могли бы предложить дальнейшие наблюдения.