Flurry Analytics — NSAutoreleasePool allocWithZone:] — утечка памяти после обновления до Objective-C ARC

#ios #memory-leaks #xcode4.2 #automatic-ref-counting #flurry

#iOS #утечки памяти #xcode4.2 #автоматический подсчет ссылок #flurry

Вопрос:

Я совсем недавно обновил свой проект до iOS 5 с помощью ARC (автоматический подсчет ссылок), и теперь Instruments сообщает об утечке памяти из NSAutoreleasePool после того, как я приостановил работу приложения в фоновом режиме.

Я подозреваю, что утечка вызвана Flurry Analytics на основе трассировки стека с помощью этих двух вызовов API:

  [FlurrySession sendSessionsToServerForSessionPause]
 [FlurrySession sendSessionsToServerWithTimeout:useWebView:requestAppCircleAds:requestVideoAds:requestAppSpotAds:sendCurrentSession:]
  

Я не делаю никаких вызовов API Flurry при приостановке. Единственный звонок, который делается в flurry, — это

 [FlurryAnalytics startSession:<my id>];
  

при первом запуске приложения.

Сообщение об утечке

 Leaked Object   #       Address     Size        Responsible     Library Responsible Frame

NSAutoreleasePool,1     0x7693f600  32 Bytes    Foundation       [NSAutoreleasePool allocWithZone:]
  

Трассировка стека

   10 libsystem_c.dylib thread_start
   9 libsystem_c.dylib _pthread_start
   8 Foundation __NSThread__main__
   7 Foundation -[NSThread main]
   6 iSURVEY  [FlurrySession sendSessionsToServerForSessionPause] /Developer/Applications/iPhoneAdAgent_modular/Classes/FlurrySession.m:931
   5 iSURVEY  [FlurrySession sendSessionsToServerWithTimeout:useWebView:requestAppCircleAds:requestVideoAds:requestAppSpotAds:sendCurrentSession:] /Developer/Applications/iPhoneAdAgent_modular/Classes/FlurrySession.m:962
   4 CoreFoundation  [NSObject(NSObject) alloc]
   3 Foundation  [NSAutoreleasePool allocWithZone:]
   2 CoreFoundation  [NSObject(NSObject) allocWithZone:]
   1 libobjc.A.dylib class_createInstance
   0 libsystem_c.dylib calloc
  

Редактировать:

Я только что попробовал отключить все отладочные переменные, такие как zombies, и утечка памяти все та же.

Редактировать 2:

Хорошо, я подтвердил, что это определенно проблема Шквала. После удаления вызова

 [FlurryAnalytics startSession:<my id>];
  

У меня больше не бывает утечки памяти.

Я сообщу об ошибке команде Flurry.

Комментарии:

1. То, что вы выполняете только один вызов Flurry API при запуске вашего приложения, не означает, что у него нет посторонних потоков, работающих в фоновом режиме, выделяющих память по желанию.

2. Да, я думал о том же самом. Мне бы очень хотелось знать, удалось ли кому-нибудь еще заставить Flurry работать с ARC без утечек памяти.

3. У меня та же проблема, но другая ошибка. Я получаю утечку строки Foundation, но удаление StartSession FlurryAnalytics приведет к устранению утечки.

Ответ №1:

Я вижу ту же утечку в 32 байта. Я думал о том, чтобы выпустить его таким образом и следить за обновлением. Одноразовая утечка в 32 байта не кажется большой проблемой. Я вижу это только тогда, когда приложение регистрируется в Flurry, а не каждый раз, когда задача выходит из фонового режима. Я использую Flurry версии 3.0.2 с iOS 5.0 в качестве базового SDK и целевой версии iOS 4.1

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

Перед вашим

 [FlurryAnalytics startSession:id];
  

Добавьте следующие два вызова:

 [FlurryAnalytics setSessionReportsOnCloseEnabled:NO];
[FlurryAnalytics setSessionReportsOnPauseEnabled:NO];
  

В документах говорится, что «onPause» по умолчанию отключен, но это не помешает убедиться.

Я также отправил отчет об ошибке в Flurry.

Комментарии:

1. Я получаю то же самое с Flurry 3.0.5. Есть ли способ наладить диалог с Flurry по этому поводу? Я беспокоюсь, что это утечка памяти и повлияет на принятие Apple.