#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.