这是正确的吗?使用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:
具有零延迟的东西 - 它不执行到位的选择,而是职位选择执行线程的运行循环,并执行它时,控制返回到运行循环(即当通话堆栈是空的)。所以在正常情况下,你不会喜欢使用它。
“这是正确的方法吗?”
不,没有理由这样做。 afterDelay:0
仅在您不想立即执行的情况下使用。如果你想立即执行它,那么你应该使用performSelector:
而不是afterDelay:
。
但是直接使用performSelector:
没有任何好处。这相当于,而且是一种更直接调用方法的更复杂的方法。你得到的警告纯粹是一个静态类型检查问题。类型(UIView *
)不保证具有该方法。您需要将其转换为支持该方法的预期视图类型,或将其转换为id
以关闭方法检查。当你使用performSelector:
时,也会围绕着方法的静态类型检查,所以它不会比将其转换为id
然后调用它更好。
对,抱歉,错字应该是'[self.superview performSelector:@selector(buttonPressedClose)withObject:nil afterDelay:0.0];' – AReality