你为什么要施放[NSNull null]

时间:2015-05-08 06:06:19

标签: ios casting

我不明白这个if语句是做什么的。为什么以这种方式投射[NSNull null]?

CAAnimation *action = (CAAnimation *)[self actionForLayer:layer forKey:@"backgroundColor"];
    if (action != (CAAnimation *)[NSNull null])
    {
        //Stuff
    }

在此gist找到它 感觉就像一个菜鸟!

3 个答案:

答案 0 :(得分:0)

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

CAAnimation *action = (CAAnimation *)[self actionForLayer:layer forKey:@"backgroundColor"];

要了解NSNull,请参阅Apple Documentation on NSNull

因此,如果您比较以下条件将失败,因为在这种情况下返回值NSNull。

if (action != nil)
{
    //Stuff
}

因此您的代码应确保它不处理NSNull值。您也可以使用以下代码执行相同的操作。

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

答案 1 :(得分:0)

从您阅读的博客中,您可以像这样阅读

  

在下面的代码中,我们创建一个名为FancyLabel的UILabel子类,并覆盖actionForLayer:forKey:以便它返回内容键的[CATransition animation]而不是[NSNull null](这是方法正常返回的):

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

然后测试代码是

    CAAnimation *action = (CAAnimation *)[NSNull null];
if (action == (CAAnimation *)[NSNull null])
{
    NSLog(@"Same Address");
}

这将记录Same Address

所以,如果我尝试删除演员

   CAAnimation *action = (CAAnimation *)[NSNull null];
if (action == [NSNull null])
{
    NSLog(@"Same Address");
}

它仍会记录Same address,但会提供警告

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

因此,这只是禁止警告

答案 2 :(得分:-1)

Objective-C样式说nil是id类型(和指向对象的指针)的用途。 C风格说NULL是你用于void *的。 C ++风格通常表示你应该使用0。