iOS Google Analytics内存越来越失控FAST

时间:2014-02-28 17:42:31

标签: ios memory google-analytics containers

我在几个iOS应用上使用了Google Analytics。没问题。这一次,问题。

我使用3.0版进行基本设置。添加库/标题,包含必需的框架,并将样板代码填入AppDelegate.m。到目前为止一切顺利,一切都按预期工作。我接受了我的第一个UIViewController并将其更改为GAITrackedViewController,并且它会击中粉丝。该应用程序在第一个屏幕上冻结,内存使用量开始上升到每秒4Meg左右。所以我改回了UIViewController,一切都很好。我尝试在viewDidLoad中手动设置屏幕名称。

// Analytics
id tracker = [[GAI sharedInstance] defaultTracker];
[tracker set:kGAIScreenName value:@"Initial"];
[tracker send:[[GAIDictionaryBuilder createAppView] build]];

同样的事情发生了。我的视图控制器有一些自定义容器视图,它是通用UINavigationViewController上的根视图控制器。我认为这可能是自定义容器混淆了哪个是活动视图控制器和使用什么屏幕名称(但我没有在日志记录中看到任何这种迹象)。

有没有人遇到这个问题,并且能够准确确定导致它的原因以及如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

João的回答是正确的,但我想解释一下。

来自Google的Getting Started文档

  

如果您的应用使用CoreData框架:响应通知,   例如来自Google的NSManagedObjectContextDidSaveNotification   Analytics CoreData对象可能会导致异常。相反,Apple   建议通过指定托管来过滤CoreData通知   对象上下文作为侦听器的参数。

这意味着......

// This code will cause a problem because it gets triggered on ANY NSManagedObjectContextDidSaveNotification.
// (both your managed object contact and the one used by Google Analytics)
[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(managedObjectContextDidSave:) 
                                      name:NSManagedObjectContextDidSaveNotification 
                                      object:nil];

// This code is safe and will only be trigger from the notification generated by your Managed Object Context.
[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(managedObjectContextDidSave:) 
                                      name:NSManagedObjectContextDidSaveNotification 
                                      object:myManagedObjectContext];

现在我阅读了文档并且我已经正确地完成了这项工作,但我仍然遇到了问题。事实证明,当我删除通知时,我没有更新我的代码。

// Not Safe
[[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:NSManagedObjectContextDidSaveNotification 
                                              object:nil];

// Safe
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:NSManagedObjectContextDidSaveNotification 
                                              object:myManagedObjectContext];

故事的寓意是,注意你的通知听众。指定特定对象的侦听器需要几秒钟,并且可能需要很长时间来调试问题,因为您不小心听取了您不想要的事件或删除了对事件的监听。

答案 1 :(得分:4)

解决方案1 ​​:在观察object时,在NSManagedObjectContextDidSaveNotification参数上使用特定的moc,这将允许您仅观察给定moc上的保存。

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

解决方案2 :如果您正在使用核心数据技术合并在后台线程上创建的moc,则无法以建议的方式轻松解决,因此替代方法是更改​​处理通知的方法为了避免在保存的moc的persistentStoreCoordinator与主moc的persistentStoreCoordinator不匹配时合并。

- (void)managedObjectContextDidSave:(NSNotification *)notification {
    if ([NSThread isMainThread]) {
        NSManagedObjectContext *savedMoc = notification.object;

        // Merge only saves of mocs that are not my managedObjectContext
        if (savedMoc == self.managedObjectContext) {
            return;
        }

        // Merge only saves of mocs that share the same persistentStoreCoordinator of my managedObjectContext (i.e.: ignore the save of Google Analytics moc)
        if (savedMoc.persistentStoreCoordinator != self.managedObjectContext.persistentStoreCoordinator) {
            return;
        }

        [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
    }
    else {
        [self performSelectorOnMainThread:@selector(handleBackgroundContextSaveNotification:) withObject:notification waitUntilDone:YES];
    }
}

答案 2 :(得分:3)

我遇到了完全相同的问题。 在我的案例中,我设法找到了解决方案:我正在注册NSManagedObjectContextDidSaveNotification而未指定上下文:

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

删除此侦听器解决了我的内存不足问题。

干杯

答案 3 :(得分:0)

我正在研究XMPP Framwork,并且我很快就修复了GA崩溃。这个失败了https://github.com/robbiehanson/XMPPFramework/blob/master/Extensions/CoreDataStorage/XMPPCoreDataStorage.m

解决此问题的简单方法。

https://github.com/robbiehanson/XMPPFramework/issues/577