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



我正在使用选择器来更改视图项目的可见性

[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,它在两个设备上都正常工作。但是这种行为的原因是什么呢?

你的代码完全被破坏了。

您正在将 NSNumber 传递给需要 BOOL 的方法。那是垃圾。你为什么会期望它有效?拿一个身份证和投到布尔就像垃圾一样。您不能将对象投射到 BOOL 并期望有意义的东西。

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

或者摆脱那个 performSelector 废话并使用块代替。

看看GCD,尤其是dispatch_after,寻找一种更干净的方法来处理这种情况。

这应该是:

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

最新更新