检查 NSDictionary 是否为空?

17

我已经尝试了多种方法。我知道字典是NULL,因为控制台也打印出来了当我在那里暂停。但是,当我把它放在一个if()语句中时,它不触发。

([myDict count] == 0) //results in crash
(myDict == NULL)
[myDict isEqual:[NSNull null]]

2
你能提供更多细节吗?如果你得到的是NULL而不是通常的nil(对于这种情况,[myDict count] == 0应该没问题),那就相当糟糕了。 - Jeremy Roman
不要仅仅描述你的控制台显示了什么;提供一个控制台中所见内容的转储。 - Extra Savoir-Faire
如果myDictnil,那么[myDict count]会导致 NSInvalidArgumentException 异常。 - daegren
6
那么 myDict 并不是 nil。将消息传递给 nil 不应导致崩溃。难道说 myDict 是一个无效的引用(比如,引用已释放的对象)吗? - Extra Savoir-Faire
如果你执行 "NSLog("myDict: <%@>", myDict);",会输出什么?如果程序崩溃了,那么 myDict 没有指向一个有效的 ObjC 对象(可能是无效指针或已释放的对象)。 - geowar
5个回答

38

看起来你有一个悬挂或野指针。

你可以将Objective-C对象视为对结构体的指针。

然后,你当然可以将它们与NULL或其他指针进行比较。

因此:

( myDict == NULL )

并且

( myDict == [ NSNull null ] )

两种写法都是有效的。

第一种写法将检查指针是否为NULLNULL通常被定义为值为0的void *
注意,对于Objective-C对象,我们通常使用nilnil也被定义为值为0的void *,因此它等于NULL。这里只是表示指向对象的NULL指针,而不是标准指针。

第二种写法将比较myDict的地址与NSNull类的单例实例。因此,您在比较两个指针值。

因此,简要总结一下:

NULL == nil == Nil == 0

由于 [ NSNull null ] 是一个有效的实例:

NULL != [ NSNull null ]

现在来谈一下这个问题:

( [ myDict count ] == 0 )

如果您有一个野指针,程序可能会崩溃:

NSDictionary * myDict;

[ myDict count ];

除非使用ARC,否则代码一定会崩溃,因为变量myDict没有被初始化,实际上可能指向任何东西。
如果存在悬空指针,也可能会导致崩溃:
NSDictionary * myDict;

myDict = [ [ NSDictionary alloc ] init ];

[ myDict release ];
[ myDict count ];

那么你会尝试向一个已释放的对象发送消息。
在Objective-C中,向nil/NULL发送消息总是有效的。

因此,这取决于你想检查一个字典是否为nil,还是它没有值(因为一个有效的字典实例可能为空)。

在第一种情况下,与nil进行比较。否则,检查计数是否为0,并确保您的实例仍然有效。也许你只是忘了在某个地方增加引用计数。


9
if (TheDict == (NSDictionary*) [NSNull null]){

//TheDict is null
    }
else{
//TheDict is not null

}

0
if([NSNull null] != [serverResponseObject objectForKey:@"Your_Key"])
{
//Success
}

你能否包含一些解释来说明这是如何解决问题的? - Berik

0

要检查字典是否具有nil或NULL数据,您可以检查[dictionary count],它将在所有情况下返回0


0

以上所有方法对我都不起作用,但这个可以。

if([mydict isKindOfClass:[NSNull class]])
{
   NSLog("Dic is Null")
}
else
{
   NSLog("Dic is Not Null")  
}

对我有用


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