转换为(id)以在Objective-C中调用任意方法

时间:2014-03-06 18:08:39

标签: objective-c performselector respondstoselector

我有一种情况需要调用一个不一定受对象支持的方法,但同时我不能使用performSelector,因为它限制了你可以传递给方法的参数类型。因此我这样做:

if ([someObject respondsToSelector:@selector(someMethod)])
    [(id)someObject someMethod];

编译器很高兴,我很高兴,但这种消息发送方法有什么警告吗?

performSelector的同步版本与上面的内容有什么本质区别?

编辑:与(id)方法相比,performSelector会有性能损失吗?

1 个答案:

答案 0 :(得分:6)

这里没有特别的警告。通过转换为id,您将丢弃编译器时间检查,但无论如何,您使用performSelector:进行了此操作。

请注意,如果您使用ARC,编译器将不允许您执行此操作,除非它看到 someMethod的某些实现。