当 Google Analytics 发送命中时发生内存泄漏

Memory Leak when Google Analytics sends a hit

我正在尝试为 iOS 使用 Google Analytics SDK v3.10。

我添加了所有依赖项和 headers,然后在我的应用委托中,方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

,我添加了这些行:

[[GAI sharedInstance] setDispatchInterval:20.0];
[[GAI sharedInstance] trackerWithTrackingId:@"UA-XXXXXXXX-X"];
[[GAI sharedInstance].logger setLogLevel:kGAILogLevelVerbose];

使用正确的跟踪 ID。

在我的着陆视图方法 viewDidAppear 中,我添加了行

id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
[tracker set:kGAIScreenName value:@"MyLandingView"];
[tracker send:[[GAIDictionaryBuilder createAppView] build]];

它会导致可怕的内存泄漏(大约 +1mb/s)并冻结这些日志:

Apr 20 08:07:47 iPad-of-Pitt MyAppName[920] <Warning>: void SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds. main run loop mode: kCFRunLoopDefaultMode

这是已知错误吗?关于如何避免这种情况的任何线索?

提前致谢!

编辑:在 google 组 https://groups.google.com/forum/?fromgroups#!topic/ga-mobile-app-analytics/0goRZOc3vk0

中重复了这个问题

编辑 2:也在此处发布了问题 https://code.google.com/p/analytics-issues/issues/detail?id=617&thanks=617&ts=1429543879

触发事件后,需要几分钟时间才能反映在仪表板中。预计用户应该没有什么耐心。这是一种看待它的方式。

关于代码,最好手动派发事件。 IT 肯定会反映在仪表板中。

id newTracker = [[GAI sharedInstance]trackerWithTrackingId:googlePropertyId];
[GAI sharedInstance].defaultTracker = newTracker; // Set newTracker as the default tracker globally.
[GAI sharedInstance].debug = YES;
DebugLog(@"Events log : %@",objAnalytics.event_description);
[newTracker trackEventWithCategory:objAnalytics.event_name
                            withAction:objAnalytics.event_description
                             withLabel:objAnalytics.event_name
                             withValue:[NSNumber numberWithInt:100]];

请尝试手动调度事件。这肯定会起作用(至少它以这种方式对我有用)。

[[GAI sharedInstance]dispatch];

我遇到了同样的问题。

在我的例子中,这是因为我使用 Core Data 和 NSManagedObjectContextDidSaveNotification 来合并来自后台进程的更新,导致 this post 中描述的异常:

我使用的解决方案是将 managedObjectContext 本身添加为 NSNotificaition 声明的对象:

ObjC

[[NSNotificationCenter defaultCenter] addObserver:self 
                                  selector:@selector(managedObjectContextDidSave:) 
                                  name:NSManagedObjectContextDidSaveNotification 
                                  object:self.managedObjectContext];

Swift

NSNotificationCenter.defaultCenter().addObserverForName(NSManagedObjectContextDidSaveNotification,
            object: self.managedObjectContext,
            queue: nil)

对我有用,不再有内存泄漏。

希望对您有所帮助。