我正在使用选择器来更改视图项目的可见性
[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
{
...
}
}