将NSNumber转换为布尔值可为iPhone和iPad提供不同的结果

时间:2014-12-08 11:55:37

标签: ios objective-c iphone ipad casting

我使用选择器更改了查看项目的可见性

[target performSelector:@selector(setVisible:) withObject:[NSNumber numberWithBool:YES] afterDelay:delay];

我在视图中的功能是:

- (void)setVisible:(BOOL)isVisible_
{
    if (isVisible_)
    {
        ...
    }
    else
    {
       ...
    }
}

此代码适用于iPhone和iPad。在iPhone中,isVisible_始终是NO。在iPad中它的工作正确。当我更改我的函数以获取id而不是BOOL,然后将其自己投射到BOOL时,它在两个设备上都能正常工作。但是这种行为的原因是什么?

2 个答案:

答案 0 :(得分:5)

您的代码完全破碎了。

您正在将NSNumber传递给期望BOOL的方法。这是垃圾。为什么你会期望这个工作?把一个id和铸造给BOOL就像垃圾一样。你不能将一个对象转换为BOOL并期望有意义的东西。

您需要一个带有NSNumber *参数的方法,然后使用boolValue。

或者摆脱那个performSelector垃圾并改为使用一个块。

查看GCD,特别是dispatch_after,以便更清晰地处理这种情况。

答案 1 :(得分:3)

应该是:

- (void)setVisible:(NSNumber *)isVisible
{
    BOOL b = [isVisible boolValue];
    if (b)
    {
        ...
    }
    else
    {
       ...
    }
}