NSUserDefaults removePersistentDomainForName崩溃问题

时间:2014-06-28 06:32:36

标签: objective-c nsuserdefaults

当我尝试保存UserDefaults值时,我收到如下所示的崩溃。

操作系统版本: Mac OS X 10.8.5(12F45)

Crashed Thread:0 Dispatch queue:com.apple.main-thread

异常类型:EXC_BAD_ACCESS(SIGSEGV)

例外代码:KERN_INVALID_ADDRESS位于0x0000000080000018

特定于应用程序的信息:objc_msgSend()选择器名称:objectForKey:

objc [240]:GC:由于设置了OBJC_DISABLE_GC而强制GC关闭

Thread 0 Crashed :: Dispatch queue:com.apple.main-thread

0 libobjc.A.dylib 0x00007fff91dcc5d0 objc_msgSend_vtable8 + 16

作业似乎已崩溃:分段错误:11

方案

当用户在“系统偏好设置”面板中登录我的应用程序时,应用程序会从更新为NSMutableDictionary的服务器接收一些设置。 更新字典后,我使用下面的代码

设置域的值
    - (void) saveUserDefaults;
{
    // Validate NSMutableDictionary instance only contains valid plist objects
    [self CheckDictionary:profileDefaults];
    NSLog(@"saveUserDefaults:  %@", profileDefaults);
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle bundleForClass: [self class]] bundleIdentifier]];

    [[NSUserDefaults standardUserDefaults] setPersistentDomain:profileDefaults forName:[[NSBundle bundleForClass:[self class]] bundleIdentifier]];

    [[NSUserDefaults standardUserDefaults] synchronize];

}

如果我退出系统偏好设置应用程序,成功登录后会发生崩溃。发生这种情况是因为每当我收到NSApplicationWillTerminateNotification时,我都会调用此saveUserDefaults()函数。在崩溃之前,我打印了NSMutableDictionary的内容,并且所有键值对都很好。我甚至添加了代码来检查我保存的NSMutableDictionary是否格式正确但无法防止崩溃

    - (void) CheckDictionary:(id)plist
{
    if (![NSPropertyListSerialization
          propertyList: plist
          isValidForFormat: kCFPropertyListXMLFormat_v1_0])
    {
        NSLog(@"Dictionary profileDefaults not in proper format");
    }
}

此崩溃仅在登录期间发生一次,当系统首选项恢复并再次启动时,即使我退出系统偏好设置应用程序,也不会发生崩溃。 这是什么意思:

Application Specific Information: objc_msgSend() selector name: objectForKey:

我无法解决此问题,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

删除此行并检查: -

 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle bundleForClass: [self class]] bundleIdentifier]];