Я пытаюсь понять разницу между 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)