2014-12-18 54 views
2

我的項目使用ARC。 Instruments中的泄漏工具報告說NSUserDefaults initWithSuiteName:泄漏內存。NSUserDefaults initWithSuiteName在iOS 8中泄漏內存?

有沒有其他人注意到了這一點?

NSUserDefaults *theDefaults = [[NSUserDefaults alloc] initWithSuiteName:self.myGroupNameStr]; 

enter image description here

+0

你可以添加任何代碼或屏幕截圖? – 2014-12-18 23:33:25

回答

3

OK,這似乎是我自己的問題。

[NSUserDefaults standardUserDefaults]不同,我自己的代碼必須假設保留所有權[[NSUserDefaults alloc] initWithSuiteName:@"group.com.company.app"]

因此,修復的方法是在我的UIInputViewController加載時初始化self.myDefaults,然後在我的UIInputViewController的dealloc中刪除self.myDefaults

+2

你能解釋爲什麼我們應該保留這個對象的所有權嗎?它應該與ARC下的任何其他對象一樣自動管理。也許我錯過了一些東西,這看起來像一個系統bug ... – 2015-06-10 12:39:37

-5

// 嘗試這種方式 .//

[[NSUserDefaults standardUserDefaults] setObject:AppDel.arrQueueForOffline forKey:@"Queued_Process"]; 

[[NSUserDefaults standardUserDefaults] synchronize]; 
+1

OP顯式說明了initWithSuiteName,而不是standardUserDefaults。 initWithSuiteName是使用用戶默認值與新的iOS 8擴展共享數據的唯一方式。使用standardUserDefaults如果可能不可能。 – Edgar 2014-12-19 10:28:34

2

創建一個NSUserDefaults的單sharedManager,併爲應用程序循環一次初始化對象

+ (NSUserDefaults *)groupUserDefaults 
{ 
    static NSUserDefaults *sharedGroupUserDefaults = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedGroupUserDefaults = [[self alloc] initWithSuiteName:@"group.company.appName"];   
    }); 
    return sharedGroupUserDefaults; 
} 
+0

我認爲,這個解決方案看起來很標準。如果它是單身人士,它可以以統一的方式跨所有班級進行訪問。無需再次編寫用於「NSUserDefaults」創建的代碼。 – 2016-01-11 13:52:23