我已经尝试了多种方法。我知道字典是NULL
,因为控制台也打印出来了当我在那里暂停。但是,当我把它放在一个if()
语句中时,它不触发。
([myDict count] == 0) //results in crash
(myDict == NULL)
[myDict isEqual:[NSNull null]]
我已经尝试了多种方法。我知道字典是NULL
,因为控制台也打印出来了当我在那里暂停。但是,当我把它放在一个if()
语句中时,它不触发。
([myDict count] == 0) //results in crash
(myDict == NULL)
[myDict isEqual:[NSNull null]]
看起来你有一个悬挂或野指针。
你可以将Objective-C对象视为对结构体的指针。
然后,你当然可以将它们与NULL
或其他指针进行比较。
因此:
( myDict == NULL )
并且
( myDict == [ NSNull null ] )
两种写法都是有效的。
第一种写法将检查指针是否为NULL
。 NULL
通常被定义为值为0的void *
。
注意,对于Objective-C对象,我们通常使用nil
。 nil
也被定义为值为0的void *
,因此它等于NULL
。这里只是表示指向对象的NULL
指针,而不是标准指针。
第二种写法将比较myDict
的地址与NSNull
类的单例实例。因此,您在比较两个指针值。
因此,简要总结一下:
NULL == nil == Nil == 0
由于 [ NSNull null ]
是一个有效的实例:
NULL != [ NSNull null ]
现在来谈一下这个问题:
( [ myDict count ] == 0 )
如果您有一个野指针,程序可能会崩溃:
NSDictionary * myDict;
[ myDict count ];
myDict
没有被初始化,实际上可能指向任何东西。NSDictionary * myDict;
myDict = [ [ NSDictionary alloc ] init ];
[ myDict release ];
[ myDict count ];
那么你会尝试向一个已释放的对象发送消息。
在Objective-C中,向nil
/NULL
发送消息总是有效的。
因此,这取决于你想检查一个字典是否为nil
,还是它没有值(因为一个有效的字典实例可能为空)。
在第一种情况下,与nil
进行比较。否则,检查计数是否为0,并确保您的实例仍然有效。也许你只是忘了在某个地方增加引用计数。
if (TheDict == (NSDictionary*) [NSNull null]){
//TheDict is null
}
else{
//TheDict is not null
}
if([NSNull null] != [serverResponseObject objectForKey:@"Your_Key"])
{
//Success
}
要检查字典是否具有nil或NULL数据,您可以检查[dictionary count],它将在所有情况下返回0
以上所有方法对我都不起作用,但这个可以。
if([mydict isKindOfClass:[NSNull class]])
{
NSLog("Dic is Null")
}
else
{
NSLog("Dic is Not Null")
}
对我有用
NULL
而不是通常的nil
(对于这种情况,[myDict count] == 0
应该没问题),那就相当糟糕了。 - Jeremy RomanmyDict
是nil
,那么[myDict count]
会导致NSInvalidArgumentException
异常。 - daegrenmyDict
并不是nil
。将消息传递给nil
不应导致崩溃。难道说myDict
是一个无效的引用(比如,引用已释放的对象)吗? - Extra Savoir-Faire