iOS Google Analytics(分析)内存失控FAST
我在多个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
上的根视图控制器。我认为这可能是自定义容器混淆了哪些是活动视图控制器和使用什么屏幕名称(但在日志记录中我没有看到这一点)。
有没有人遇到这个问题,并能够明确究竟是什么导致它,以及如何解决它?
若昂的答案是正确的,但我想更多地解释它。
从谷歌的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];
故事的寓意是,注意你的通知监听器。需要几秒钟才能为特定对象指定侦听器,并且调试问题可能需要很长时间,因为您意外收听不想要的事件或删除侦听事件。
我有完全相同的问题。 我已经成功地找到我的情况的解决方案:我被注册到NSManagedObjectContextDidSaveNotification
不指定上下文:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(managedObjectContextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:nil];
删除此监听器解决了我的内存不足的问题。
干杯
解决方案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];
}
}
我在XMPP Framwork上工作,尽快修复GA崩溃。这一个失败https://github.com/robbiehanson/XMPPFramework/blob/master/Extensions/CoreDataStorage/XMPPCoreDataStorage.m
任何简单的方法来解决这个问题。
使用仪器。什么是分配?哪里? – Wain
从'NSManagedObjectID'类的'URIRepresentation'方法调用'CFString'和'CFURL'。很多小的。我不能(可能我只是不知道该怎么做)超出这个范围,因为它看起来是从谷歌的图书馆中走出来的。 – DBD