Iphone [NSNull isEqualToString:]

Iphone [NSNull isEqualToString:],iphone,ios,string,dictionary,null,Iphone,Ios,String,Dictionary,Null,我试图将字符串设置为“如果[object objectForKey@“Display_name”]为空,则无显示名称”。它在日志中崩溃了 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 0x12

我试图将字符串设置为“如果[object objectForKey@“Display_name”]为空,则无显示名称”。它在日志中崩溃了

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


强制转换不会更改对象
(类型)

当您的值为
[NSNull-null]
时,您必须使用以下内容来管理案例:

id displayNameTypeValue = [object objectForKey:@"display_name"];
NSString *displayNameType = @"";
if (displayNameTypeValue != [NSNull null])
   displayNameType = (NSString *)displayNameTypeValue;

您可能需要以下内容:

NSString *displayNameType = NSStringFromClass([[object objectForKey:@"display_name"] class]);
_lblBusinessName.text = **(NSObject*)**_business.BusinessName != [NSNull null] ? _business.BusinessName : @"";

顺便说一句,在你的问题中,它不应该读“if is NULL”,而是“if is a
NSNull
实例”。

检测对象是否为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]){
    // ...
}

我还没有测试第二个论点,但是。

我会给出我的答案来澄清一下。问题在于NSDictionary中的对象具有[NSNull null]值(与nil和null略有不同)。问题来自一些库(我想到的是一个特定的JSON解析器)将一些具有NULL值的键的值设置为[NSNull]。为什么?因为有时需要在NSDictionary中区分键不存在的情况和键具有空值的情况。在NSDictionary中没有办法说明,但JSON结构确实传达了这种差异。当您获得一个来自库或解析器的变量时,该变量的值可能是[NSNull]。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
}

我在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

我通过对[NSNull]进行检查来解决这个问题。我在应用程序中使用的代码:

_lblBusinessName.text = _business.BusinessName != [NSNull null] ? _business.BusinessName : @"";
但是,XCode抛出了一些警告,因此为了消除我对NSObject*类型强制转换的警告,如下所示:

NSString *displayNameType = NSStringFromClass([[object objectForKey:@"display_name"] class]);
_lblBusinessName.text = **(NSObject*)**_business.BusinessName != [NSNull null] ? _business.BusinessName : @"";

根据我的经验,这个字体很可能不见了。如果出现问题,可以检查新字体的设置位置以及是否存在

let font = UIFont.init(name:"YOUR_FONT_NAME", size: 16) -> is it nil or not ?

你为什么要把一个类转换成一个字符串?回答得好?使用字符串检查对象类型?。。。这是一个答案,这是有效的,但说真的。。。太丑了!>-1我同意Vincent G的观点。我会做
foo==[NSNull null]
来测试null,也会做
[foo isKindOfClass:[NSString class]]
来确保在解析类似JSON的东西时它确实是一个字符串。好的,谢谢你的建议@Vincent和@Daniel就个人而言,我也会进行[NSNull]比较。我给出的代码只是对Sam原始代码的一个最小修复(只修复了它的错误,但没有改变它的工作方式)。我提供了它:
if(displayNameTypeValue!=[NSNull null])
或者在一行
if([objectobjectobjectforkey:@“display_name”]=[NSNull])
谢谢@André中,我删除了我的否决票,很抱歉,我有点害怕你的答案会被接受,更糟糕的是,会被用在代码中。:)