"NSInvalidArgumentException",原因:"*** setObjectForKey: object cannot be nil (key: device_uid)"

4

当我尝试在我的iPhone上运行应用程序时,出现了错误。我不明白为什么在这种情况下会出现空值错误。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '  setObjectForKey: object cannot be nil (key: device_id)'
First throw call stack: (0x183ce0f48 0x19918bf80 0x183bcc4e0 0x10006f5f0 0x1002b9ca8 0x1002b9c68 0x1002bf710 0x183c981f8 0x183c96060 0x183bc4ca0 0x18f148088 0x1892dcffc 0x1000716a0 0x1999ce8b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

这是与该错误有关的appdelegate.m文件的部分内容:
// Get the users Device Model, Display Name, Token & Version Number
UIDevice *device = [UIDevice currentDevice];

NSUserDefaults *dict = [NSUserDefaults standardUserDefaults];
NSString *identifier = [dict stringForKey:@"identifier"];
NSString *deviceName = device.name;
NSString *deviceModel = device.model;
NSString *deviceSystemVersion = device.systemVersion;

// Prepare the Device Token for Registration (remove spaces and < >)
NSString *deviceToken = [[[[token description]
stringByReplacingOccurrencesOfString:@"<"withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString: @" " withString: @""];

NSMutableDictionary *postDatas = [NSMutableDictionary dictionary];
[postDatas setObject:appName forKey:@"app_name"];
[postDatas setObject:appVersion forKey:@"app_version"];
[postDatas setObject:identifier forKey:@"device_uid"];
[postDatas setObject:deviceToken forKey:@"device_token"];
[postDatas setObject:deviceName forKey:@"device_name"];
[postDatas setObject:deviceModel forKey:@"device_model"];
[postDatas setObject:deviceSystemVersion forKey:@"device_version"];
[postDatas setObject:pushBadge forKey:@"push_badge"];
[postDatas setObject:pushAlert forKey:@"push_alert"];
[postDatas setObject:pushSound forKey:@"push_sound"];

Request *request = [Request alloc];
request.delegate = self;

[request postDatas:postDatas withUrl:@"push/iphone/registerdevice/"];

这个方法是否已经被弃用?

2个回答

5
您的标识符中获取到了nil。因此,请像这样检查它。
NSString *identifier = [dict stringForKey:@"identifier"];

if([identifier length] != 0)
    [postDatas setObject:identifier forKey:@"device_uid"];
else
    [postDatas setObject:@"" forKey:@"device_uid"];

谢谢你的回答。不幸的是,它还是没有起作用,错误仍然存在。 - Siberian Scout
这就是为什么这个错误让我发疯的原因 :) - Siberian Scout
@SiberianScout请把我的代码放在这一行的位置[postDatas setObject:identifier forKey:@"device_uid"];。 - Dharmbir Singh
从这个答案中删除else部分,你的应用程序就不会崩溃了。 - Manvik
实际上错误提示中只有一个小变化: 原因: '*** setObjectForKey: object cannot be nil (key: )' - Siberian Scout
@SiberianScout 由于您的某些值为nil,您需要对所有这些值进行nil检查。 - Manvik

1

您不能将nil值放入字典中,否则会导致崩溃。

真正需要调查的是:这些nil值来自哪里,当您遇到nil值时应该采取什么适当的措施?这只有您自己可以决定。Mukesh的答案应该告诉您如何存储空字符串而不是nil,这样就可以避免崩溃。这通常是正确的做法,但并不总是。因此,请调查您的应用程序在其中一个值为nil时应该执行的操作,并确保它正好执行该操作。


谢谢你的回答。我仍在努力改进这一部分,但这个答案帮助我检查是否还有其他问题。 - Siberian Scout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接