当我尝试保存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:
我无法解决此问题,非常感谢任何帮助。
答案 0 :(得分:0)
删除此行并检查: -
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle bundleForClass: [self class]] bundleIdentifier]];