我试图将字符串设置为“如果[object objectForKey @”display_name“]为NULL,则为”无显示名称“。它在日志中崩溃了
2011-06-16 10:58:36.251 BV API[15586:ef03] displayNameType is: NSNull
2011-06-16 10:58:36.251 BV API[15586:ef03] +[NSNull isEqualToString:]: unrecognized selector sent to class 0x1228c40
2011-06-16 10:58:36.253 BV API[15586:ef03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSNull isEqualToString:]: unrecognized selector sent to class 0x1228c40'
*** First throw call stack:
(0x1198f1c 0x132b52e 0x119bb2b 0x10f3076 0x10f2bb2 0x116d9 0x112ad 0x8b0e17 0x8b9783 0x8b43ae 0x8b9d20 0xb6312b 0x815c35 0xac2e1e 0x8b7583 0x8b771d 0x8b775d 0xc1b5 0x7ed84c 0x7ed7e2 0x89477a 0x894c4a 0x893ee4 0x813002 0x81320a 0x7f960c 0x7ecd52 0x211b8f6 0x116831a 0x10c3d07 0x10c1e93 0x10c1750 0x10c1671 0x211a0c3 0x211a188 0x7eac29 0x1b29 0x1aa5)
terminate called throwing an exceptionsharedlibrary apply-load-rules all
Current language: auto; currently objective-c
NSString *displayNameType = (NSString *)[[object objectForKey:@"display_name"] class ];
NSLog(@"displayNameType is: %@", displayNameType);
NSString *displayNameString = [NSString stringWithFormat:@"%@", [object objectForKey:@"display_name"]];
displayNameString = [displayNameString uppercaseString];
if ([displayNameType isEqualToString:@"NSNull"]) {
NSLog(@"dnt is null");
NSString *displayNameString = @"No Display Name";
displayNameString = [displayNameString uppercaseString];
}
答案 0 :(得分:41)
强制转换不会更改对象class
(类型)。
当您的值为[NSNull null]
时,您必须使用以下内容管理案例:
id displayNameTypeValue = [object objectForKey:@"display_name"];
NSString *displayNameType = @"";
if (displayNameTypeValue != [NSNull null])
displayNameType = (NSString *)displayNameTypeValue;
答案 1 :(得分:6)
我在NSNull上创建了一个类别,对我很有用:
@interface NSNull (string)
-(BOOL) isEqualToString:(NSString *) compare;
@end
@implementation NSNull (string)
-(BOOL) isEqualToString:(NSString *) compare {
if ([compare isKindOfClass:[NSNull class]] || !compare) {
NSLog(@"NSNull isKindOfClass called!");
return YES;
}
return NO;
}
@end
答案 2 :(得分:3)
你可能想要这样的东西:
NSString *displayNameType = NSStringFromClass([[object objectForKey:@"display_name"] class]);
在你的问题中,它不应该是“如果它是NULL”,而是“如果它是NSNull
实例”。
答案 3 :(得分:2)
我会在答案中澄清一下。问题是NSDictionary中的对象具有[NSNull null]值(与nil和NULL略有不同)。问题来自一些库(我想到一个特定的JSON解析器)将一些具有NULL值的键的值设置为[NSNull null]。为什么?因为有时需要在NSDictionary中区分当键具有NULL值时不存在键的情况。在NSDictionary中没有办法说明,但JSON结构确实传达了这种差异。当你得到一个来自库或解析器的变量时,该值可能是[NSNull null]。 NSNull是一个单例因此只检查相等(指针相等)就足够了。例如,我会这样做:
NSString *value = [object objectForKey:@"display_name"];
if (value && value != [NSNull null]){
// Here I have the value I expect
// Do something
}else{
// The value is null ... don't display
}
答案 4 :(得分:0)
检测对象是否为null,而不是尝试从类名推断。
// if you're key may not exist (NSDictionary will return nil... not sure what type
// you are using
if (![object objectForKey:@"display_name"]){
// ...
}
// or if the value may actually be an NSNull object
if ([[object objectForKey:@"display_name"] == (id)[NSNull null]){
// ...
}
我没有测试第二个参数,但是look here for more about testing null。
答案 5 :(得分:0)
我通过对[NSNull null]进行检查来解决这个问题。我在我的应用中使用的代码:
_lblBusinessName.text = _business.BusinessName != [NSNull null] ? _business.BusinessName : @"";
然而,XCode抛出了一些警告,以便摆脱我投放到NSObject *类型的那些,如下所示:
_lblBusinessName.text = **(NSObject*)**_business.BusinessName != [NSNull null] ? _business.BusinessName : @"";
答案 6 :(得分:0)
我的经验是字体丢失,如果遇到问题,应检查设置新字体的位置,该字体是否存在
let font = UIFont.init(name:"YOUR_FONT_NAME", size: 16) -> is it nil or not ?