我试图理解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)
答案 0 :(得分:3)
您必须始终首先将objc_msgSend()
强制转换为正确的函数指针类型。类型id(*)(id, SEL, ...)
类型不正确,除非您的方法确实返回id
并接受...
(IIRC在语法上是不可能的)。
如果使用不正确的函数类型调用objc_msgSend()
,则被调用的方法可能无法正确接收参数值。