arm64上的objc_msg发送宏

时间:2014-06-02 21:08:48

标签: objective-c objective-c-runtime

我试图理解id objc_msgSend(id self, SEL op, ...)void objc_msgSend(void)

之间的区别

我有这个宏适用于所有类型的方法。但是,当转换到arm64时,此版本的objc_msgSend不再可用。

#define safePerformSelector(target, selector, ...) ([target respondsToSelector:selector] ? objc_msgSend(target, selector, ##__VA_ARGS__) : nil)

这是我到目前为止所提出的方法,但它似乎只适用于返回对象的方法,而对于那些不会返回对象的方法则无效。

#define safePerformSelector(target, selector, ...) ([target respondsToSelector:selector] ? ((id (*)(id, SEL, ...))objc_msgSend)(target, selector, ##__VA_ARGS__) : nil)

1 个答案:

答案 0 :(得分:3)

您必须始终首先将objc_msgSend()强制转换为正确的函数指针类型。类型id(*)(id, SEL, ...)类型不正确,除非您的方法确实返回id并接受...(IIRC在语法上是不可能的)。

如果使用不正确的函数类型调用objc_msgSend(),则被调用的方法可能无法正确接收参数值。