这是正确的吗?使用performSelector而不是只调用该方法直接

问题描述:

我想用这种方法[self.superview buttonPressedClose];这是正确的吗?使用performSelector而不是只调用该方法直接

我已经实现了我的上海华这种方法,一切工作以关闭上海华。

但它给了我一个提示“UIView在编译期间可能不会响应'buttonPressedClose'”。

如果我将其更改为以下行,它不会给我警报,但这是正确的方法吗?

if ([self.superview respondsToSelector:@selector(buttonPressedClose)]) { 
    [self.superview performSelector:@selector(buttonPressedClose) withObject:nil afterDelay:0.0]; 
} 

谢谢。

**编辑错字

这是一个错字或在您的代码?

if ([self.superview respondsToSelector:@selector(buttonPressedClose)]) { 
                // vv here 
[self.superview performSelector:@selector(buttonPressedCLose) withObject:nil afterDelay:0.0]; 
} 

一般来说,self.superview返回UIView类型的对象,你的buttonPressedClose是不是在UIView实现了自定义选择。这就是为什么你会收到警告。

你可能想投self.superview到你想要的类型,例如:

[(MyView *)self.superview buttonPressedClose]; 

或使其更加神秘和转换为id - 编译器不检查选择的存在,那么:

[(id)self.superview buttonPressedClose]; 

也就是说,以上所有解决方案都有点臭。

一个非常重要关于performSelector:具有零延迟的东西 - 它不执行到位的选择,而是职位选择执行线程的运行循环,并执行它时,控制返回到运行循环(即当通话堆栈是空的)。所以在正常情况下,你不会喜欢使用它。

+0

对,抱歉,错字应该是'[self.superview performSelector:@selector(buttonPressedClose)withObject:nil afterDelay:0.0];' – AReality

“这是正确的方法吗?”

不,没有理由这样做。 afterDelay:0仅在您不想立即执行的情况下使用。如果你想立即执行它,那么你应该使用performSelector:而不是afterDelay:

但是直接使用performSelector:没有任何好处。这相当于,而且是一种更直接调用方法的更复杂的方法。你得到的警告纯粹是一个静态类型检查问题。类型(UIView *)不保证具有该方法。您需要将其转换为支持该方法的预期视图类型,或将其转换为id以关闭方法检查。当你使用performSelector:时,也会围绕着方法的静态类型检查,所以它不会比将其转换为id然后调用它更好。