Obj_msgSend ошибка указателя функции при сборке с 64-битным arm64

На самом деле мой оригинальный код отлично работает с Xcode 5.0.2, а также отлично подходит для отправки в App Store, который:

objc_msgSend(self.target, self.successAction, category);

Эта строка вызывает сбои с Xcode5.1 beta5. Я нашел решение для исправления сбоя: Версия SudzC ARC - вызов objc_msgSend вызывает EXC_BAD_ACCESS с использованием 64-битной архитектуры

// solution
id (*response)(id, SEL, id) = (id (*)(id, SEL, id)) objc_msgSend;
response(self.target, self.successAction, category);

И я вообще не испытываю проблем с использованием Xcode 5 или Xcode5.1beta для тестирования на устройствах (iPhone 5s) или симуляторе (32 бит или 64 бит) при использовании рекомендованного решения. Параметрами архитектуры в настройках сборки являются "Стандартные архитектуры (armv7, armv7s)" в Xcode 5 и "Стандартные архитектуры (armv7, armv7s, arm64)".

Однако моя новая версия приложения готова к продаже в App Store сегодня. И он падает на всех устройствах (iPhone 5, 5, 4), установленных (согласно отчету Crashlytics). Поскольку я не получаю сбой с помощью Xcode (сборка на реальном устройстве), я не знаю, исправляю ли я проблему или нет, прежде чем ее рассмотрит Apple.

Ответ 1

Наконец, я могу воспроизвести крах прямо сейчас. Просто отредактируйте схему сборки и измените "Запустите YOURAPPNAME.app" из Debug to Release.

И сразу после того, как я смогу воспроизвести эту ошибку, я знаю, как ее исправить. Поскольку мой тип функции селектора недействителен (ничего не возвращает), я не должен просто копировать вопрос (используя "id" ).

Изменяя:

id (*response)(id, SEL, id) = (id (*)(id, SEL, id)) objc_msgSend;
response(self.target, self.successAction, category);

To:

void (*response)(id, SEL, id) = (void (*)(id, SEL, id)) objc_msgSend;
response(self.target, self.successAction, category);

Он исправляет!! Или однострочный код благодаря этой фиксации в github:

((void(*)(id, SEL, id))objc_msgSend)(self.target, self.successAction, category);