我有一种情况需要调用一个不一定受对象支持的方法,但同时我不能使用performSelector,因为它限制了你可以传递给方法的参数类型。因此我这样做:
if ([someObject respondsToSelector:@selector(someMethod)])
[(id)someObject someMethod];
编译器很高兴,我很高兴,但这种消息发送方法有什么警告吗?
performSelector的同步版本与上面的内容有什么本质区别?
编辑:与(id)方法相比,performSelector会有性能损失吗?
答案 0 :(得分:6)
这里没有特别的警告。通过转换为id
,您将丢弃编译器时间检查,但无论如何,您使用performSelector:
进行了此操作。
请注意,如果您使用ARC,编译器将不允许您执行此操作,除非它看到 someMethod
的某些实现。