Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何从SBJSON测试NSDictionary中的null?_Objective C_Ios5_Xcode4.3 - Fatal编程技术网

Objective c 如何从SBJSON测试NSDictionary中的null?

Objective c 如何从SBJSON测试NSDictionary中的null?,objective-c,ios5,xcode4.3,Objective C,Ios5,Xcode4.3,我有一个API返回一个JSON编码的数据字符串,该字符串返回一个实数或“null”作为值。只要JSON包含一个数字或字符串值,一切都会正常工作。如果key:value对值为null,则下面的代码将崩溃 当NSDictionary objectForKey从SBJSON获取空值时,如何正确测试它 当API为文件类型返回null时,下面的代码在if()行崩溃 我的Objective-C代码尝试测试预期值: if (1 == [[task valueForKey:@"filetype"] intege

我有一个API返回一个JSON编码的数据字符串,该字符串返回一个实数或“null”作为值。只要JSON包含一个数字或字符串值,一切都会正常工作。如果key:value对值为null,则下面的代码将崩溃

当NSDictionary objectForKey从SBJSON获取空值时,如何正确测试它

当API为文件类型返回null时,下面的代码在if()行崩溃

我的Objective-C代码尝试测试预期值:

if (1 == [[task valueForKey:@"filetype"] integerValue]) {
    // do something
} else {
    // do something else
}
API JSON输出:

{"tclid":"3","filename":null,"filetype":null}
NSDictionary的NSLog()输出为:

task {
    filename = "<null>";
    filetype = "<null>";
    tclid = 3;
}
任务{
filename=“”;
filetype=“”;
tclid=3;
}

将数据从JSON传输到Cocoa集合时,该类用于表示“无值”,因为Cocoa集合不能有空插槽
NSNull
打印自身的方式

要对此进行测试,可以使用
someObject==[NSNull]
。它是一个单实例——每个进程只有一个
NSNull
实例——因此指针比较是有效的,尽管您可能更喜欢遵循通常的Cocoa比较约定并使用
[someObject iskindof class:[NSNull class]]


您之所以会发生崩溃,是因为您正在向该
NSNull
对象发送
integerValue
NSNull
不响应
integerValue
并引发异常。

将数据从JSON传输到Cocoa集合时,该类用于表示“无值”,因为Cocoa集合不能有空插槽
NSNull
打印自身的方式

要对此进行测试,可以使用
someObject==[NSNull]
。它是一个单实例——每个进程只有一个
NSNull
实例——因此指针比较是有效的,尽管您可能更喜欢遵循通常的Cocoa比较约定并使用
[someObject iskindof class:[NSNull class]]


您之所以会发生崩溃,是因为您正在向该
NSNull
对象发送
integerValue
NSNull
不响应
integerValue
并引发异常。

您应该首先测试是否有值为null,如果该值为null,则执行intValue方法可能会使应用程序崩溃。 这样做应该可以

if ([[task valueForKey:@"filetype"] isKindOfClass:[NSNumber Class]] && 1 == [[task valueForKey:@"filetype"] integerValue]) {
    // do something
} else {
     // do something else
}

我希望它能有所帮助。

您应该首先测试是否有一个值为null,如果该值为null,则执行intValue方法可能会使应用程序崩溃。 这样做应该可以

if ([[task valueForKey:@"filetype"] isKindOfClass:[NSNumber Class]] && 1 == [[task valueForKey:@"filetype"] integerValue]) {
    // do something
} else {
     // do something else
}

我希望有帮助。

这仍然会崩溃,因为对象不是
nil
,而是
NSNull
单例。表达式的第一部分将为true,然后将
intValue
发送到
[NSNull null]
,它不会响应
intValue
。如果对象为
nil
(如果它在集合中则不可能),则发送
intValue
不会崩溃。谢谢,我没有真正尝试过,我更新了答案以更正它。应该可以。这不会崩溃,但是仍然没有必要做第一个测试——如果它不是真的(字典中没有该键的值),那么第二个测试也不会是真的(
[nil isKindOfClass:
将像任何消息一样返回0到
nil
)。因为表达式从左到右求值,[nil isKindOfClass:]不会发生,因为第一个表达式是假的。对,但是没有理由做第一个,因为如果第一个表达式是假的,第二个表达式永远不会是真的。您可以只使用第二个,并且具有相同的真值。这仍然会崩溃,因为对象不是
nil
,而是
NSNull
单例。表达式的第一部分将为true,然后将
intValue
发送到
[NSNull null]
,它不会响应
intValue
。如果对象为
nil
(如果它在集合中则不可能),则发送
intValue
不会崩溃。谢谢,我没有真正尝试过,我更新了答案以更正它。应该可以。这不会崩溃,但是仍然没有必要做第一个测试——如果它不是真的(字典中没有该键的值),那么第二个测试也不会是真的(
[nil isKindOfClass:
将像任何消息一样返回0到
nil
)。因为表达式从左到右求值,[nil isKindOfClass:]不会发生,因为第一个表达式是假的。对,但是没有理由做第一个,因为如果第一个表达式是假的,第二个表达式永远不会是真的。你可以使用第二个,并且有相同的真值。可能的重复(虽然我回答了,所以…我也给了Josh+1。)可能的重复(虽然我回答了,所以…我也给了Josh+1。)