2014-12-18 51 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