Ios 为什么要强制转换[NSNull]

Ios 为什么要强制转换[NSNull],ios,casting,Ios,Casting,我不明白这个if语句在做什么。为什么以这种方式强制转换[NSNull null] CAAnimation *action = (CAAnimation *)[self actionForLayer:layer forKey:@"backgroundColor"]; if (action != (CAAnimation *)[NSNull null]) { //Stuff } 在这上面找到的 感觉像个傻瓜 如果关键点“backgroundColor”不存在

我不明白这个if语句在做什么。为什么以这种方式强制转换[NSNull null]

CAAnimation *action = (CAAnimation *)[self actionForLayer:layer forKey:@"backgroundColor"];
    if (action != (CAAnimation *)[NSNull null])
    {
        //Stuff
    }
在这上面找到的
感觉像个傻瓜

如果关键点“backgroundColor”不存在此类动画,则以下语句可能会返回NSNull值(请注意,NSNull不是nil),而不是CAAnimation实例

要了解NSNull,请参阅

因此,如果进行如下比较,条件将失败,因为在本例中,返回值为NSNull

if (action != nil)
{
    //Stuff
}
因此,您的代码应该确保它不会处理NSNull值。您还可以使用以下代码执行相同的操作

if (action != nil && [action isKindOfClass:[CAAnimation class]])
{
    //Stuff
}

Objective-C风格表示nil是用于id类型(以及指向对象的指针)的对象。 C风格表示NULL是用于void*的值。
C++风格通常说你只需使用0。./p>< p>从你读的博客中,你可以这样阅读< /p> 在下面的代码中,我们创建了一个名为FancyLabel的UILabel子类,并覆盖actionForLayer:forKey:以使其返回内容键的[CatTransition animation],而不是[NSNull null](这是该方法通常返回的结果):

因此,此方法可以返回
[NSNull null]

那么测试代码是

    CAAnimation *action = (CAAnimation *)[NSNull null];
if (action == (CAAnimation *)[NSNull null])
{
    NSLog(@"Same Address");
}
这将记录相同的地址

所以如果我试图删除演员阵容

   CAAnimation *action = (CAAnimation *)[NSNull null];
if (action == [NSNull null])
{
    NSLog(@"Same Address");
}
它仍将记录相同的地址,但会发出警告

所以,由于[NSNull null]是单例的,如果两个指针指向它,它必须是
=


因此,这里是suppress warning

可能是为了抑制类型比较警告。我不会将其描述为转换为
[NSNull null]
;相反,它是对
[NSNull-null]
的测试。
   CAAnimation *action = (CAAnimation *)[NSNull null];
if (action == [NSNull null])
{
    NSLog(@"Same Address");
}