2014-02-28 72 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]; 
    } 
} 
相關問題