检查NSDictionary是否为空?

mon*_*age 14 iphone objective-c

我尝试了多种方法.我知道字典是NULL,因为当我在那里打破时控制台也打印出来.然而,当我把它放在if()中时它不会触发.

([myDict count] == 0) //results in crash
(myDict == NULL)
[myDict isEqual:[NSNull null]]
Run Code Online (Sandbox Code Playgroud)

Mac*_*ade 34

看起来你有一个悬垂或狂野的指针.

您可以将Objective-C对象视为结构的指针.

然后,您可以将它们NULL与其他指针或其他指针进行比较.

所以:

( myDict == NULL )
Run Code Online (Sandbox Code Playgroud)

( myDict == [ NSNull null ] )
Run Code Online (Sandbox Code Playgroud)

都是有效的.

第一个将检查指针是否是NULL.NULL通常定义为void *值为0.
注意,对于Objective-C对象,我们通常使用nil.nil也被定义为a void *值为0,所以它等于NULL.它就在这里表示NULL指向对象的指针,而不是标准指针.

第二个比较myDictNSNull该类的单例实例的地址.所以你在这里比较两个指针值.

所以要快速恢复:

NULL == nil == Nil == 0
Run Code Online (Sandbox Code Playgroud)

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

NULL != [ NSNull null ]
Run Code Online (Sandbox Code Playgroud)

现在关于这个:

( [ myDict count ] == 0 )
Run Code Online (Sandbox Code Playgroud)

如果你有一个野指针可能会崩溃:

NSDictionary * myDict;

[ myDict count ];
Run Code Online (Sandbox Code Playgroud)

除非使用ARC,否则它肯定会崩溃,因为myDict变量尚未初始化,实际上可能指向任何东西.

如果你有一个悬空指针,它也可能崩溃:

NSDictionary * myDict;

myDict = [ [ NSDictionary alloc ] init ];

[ myDict release ];
[ myDict count ];
Run Code Online (Sandbox Code Playgroud)

然后,您将尝试向已释放的对象发送消息.
nil/ 发送消息NULL始终在Objective-C中有效.

因此,这取决于您是否要检查字典是否nil,或者它是否没有值(因为有效的字典实例可能为空).

在第一种情况下,与之比较nil.否则,检查count是否为0,并确保实例仍然有效.也许你只是忘了保留某个地方.


Jøh*_*røw 8

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

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

}
Run Code Online (Sandbox Code Playgroud)