如果对象响应仍然会发出警告

Rob*_*Rob 2 xcode objective-c

我正在开发一个项目,我有一个UIView属性的类.我还定义了一个类,它是一个UIView定义某个方法的子类.如果我有以下代码,我在构建时会收到警告:

// In this example, myView is UIView property which *may* contain a UIView or 
// my subclassed-UIView which has the myMethod method
if([myView respondsToSelector:@selector(myMethod)]){
   [myView myMethod]
}
Run Code Online (Sandbox Code Playgroud)

警告是"UIView可能无法响应'-myMethod'".警告显然不能阻止应用程序的构建,但我只想弄清楚如何处理它.这是正确的方法吗?有办法停止这个警告吗?

jtb*_*des 5

警告仅仅是因为编译器不知道该视图是否是您的自定义子类.当然,在运行时它会正常工作,因为它将是一个子类.您有两种方法可以解决它:

[myView performSelector:@selector(myMethod)];
Run Code Online (Sandbox Code Playgroud)

(因此编译器根本不检查方法调用)

或更好:

[(MyViewClass *)myView  myMethod];
Run Code Online (Sandbox Code Playgroud)

这样编译器就好像对象确实是你的视图子类(当然你执行检查之后).

就此而言,检查您的类而不是方法可能是有意义的:

if ([myView isKindOfClass:[MyViewClass class]]) { ...
Run Code Online (Sandbox Code Playgroud)