2014-02-28 35 views
6

我在多个iOS应用上使用了Google Analytics(分析)。没问题。这一次,问题。iOS Google Analytics(分析)内存失控FAST

我使用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上的根视图控制器。我认为这可能是自定义容器混淆了哪些是活动视图控制器和使用什么屏幕名称(但在日志记录中我没有看到这一点)。

有没有人遇到这个问题,并能够明确究竟是什么导致它,以及如何解决它?

+0

使用仪器。什么是分配?哪里? – Wain

+1

从'NSManagedObjectID'类的'URIRepresentation'方法调用'CFString'和'CFURL'。很多小的。我不能(可能我只是不知道该怎么做)超出这个范围,因为它看起来是从谷歌的图书馆中走出来的。 – DBD

回答

5

若昂的答案是正确的,但我想更多地解释它。

从谷歌的Getting Started文件

如果你的应用程序使用CoreData框架:应对通知, 例如来自Google Analytics(分析)CoreData对象的NSManagedObjectContextDidSaveNotification可能会导致异常。相反,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]; 

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

3

我有完全相同的问题。 我已经成功地找到我的情况的解决方案:我被注册到NSManagedObjectContextDidSaveNotification不指定上下文:

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

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

干杯

4

解决方案1 ​​:观察NSManagedObjectContextDidSaveNotification当使用特定MOC上object参数,这将让您观察只保存在给定的MOC。

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

解决方案2:如果您使用的是合并在后台线程创建MOCS的核心数据技术,你不能轻易解决的建议的方式,所以另一种方法是改变你的方法,为了处理通知以避免在保存的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]; 
    } 
}