【问题标题】:Memory Leak when Google Analytics sends a hitGoogle Analytics 发送命中时的内存泄漏
【发布时间】:2015-06-27 01:54:34
【问题描述】:

我正在尝试使用适用于 iOS 的 Google Analytics SDK v3.10。

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

- (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

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

提前致谢!

编辑:在谷歌群组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

【问题讨论】:

  • 这是一个已知的错误吗?关于如何避免这种情况的任何线索? (不知道,但我可以 ping 开发团队并找出答案)
  • 仅供参考 @DaImTo ,GA 的“获取帮助”页面的第一个建议是:询问有关使用和开发 Google Analytics API、库和 SDK 的问题的最佳位置是 on Stack Overflow 或官方 Analytics 开发者论坛之一。
  • 是的,原因是他们监控这个论坛。我刚刚听说有一个问题被打开,有人正在调查它。
  • 你有链接到你提到的问题还是我的问题?你说“有人在调查”?你在谁和哪里看到的?另外,我可能误解了您的第一条评论,对我来说听起来像是“您没有做作业”,这就是为什么我发布了我之前的两个 cmets。
  • 该错误由 Google Analytics(分析)开发团队在内部记录,您无法看到。我直接将您的问题通过电子邮件发送给他们。他们给我发电子邮件说他们已将其记录为问题

标签: ios memory-leaks google-analytics google-analytics-sdk


【解决方案1】:

我有同样的问题。

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

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

ObjC

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

斯威夫特

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

为我做了诀窍,不再有内存泄漏。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    关于代码,最好手动调度事件。 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];
    

    【讨论】:

    • 您的代码与 3.10 SDK 不兼容(GAI 上没有调试属性)。将唯一实例化的跟踪器设置为默认跟踪器是没有意义的。你没有解决我的主要问题:内存泄漏。所以我对你的回答投了反对票。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多