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

Bur*_*aci 0 iphone casting objective-c ipad ios

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

[target performSelector:@selector(setVisible:) withObject:[NSNumber numberWithBool:YES] afterDelay:delay];
Run Code Online (Sandbox Code Playgroud)

我在视图中的功能是:

- (void)setVisible:(BOOL)isVisible_
{
    if (isVisible_)
    {
        ...
    }
    else
    {
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

gna*_*729 5

你的代码完全破碎了.

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

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

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

看看GCD,尤其是dispatch_after,可以更清晰地处理这种情况.