5

実際、私の元のコードは Xcode 5.0.2 でうまく動作し、次のような App Store への送信にも最適です。

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

この行により、Xcode5.1 beta5 でクラッシュが発生します。クラッシュを修正する解決策を見つけました: SudzC ARC バージョン - objc_msgSend 呼び出しにより、64 ビット アーキテクチャを使用して EXC_BAD_ACCESS が発生します

// 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 ビット) でテストしても、まったく問題はありません。ビルド設定のアーキテクチャ設定は、Xcode 5 の「標準アーキテクチャ (armv7、armv7s)」と「標準アーキテクチャ (armv7、armv7s、arm64)」です。

ただし、私の新しいバージョンのアプリは、今日 App Store で販売する準備ができています。また、インストールされているすべてのデバイス (iPhone 5s、5、4s) でクラッシュします (Crashlytics レポートによると)。Xcode (実機へのビルド) を使用してクラッシュが発生しないため、問題を修正するかどうかは、Apple のレビューを受ける前にわかりません。

4

1 に答える 1

9

最後に、今すぐクラッシュを再現できます。Build Scheme を編集し、"Run YOURAPPNAME.app" を Debug から Release に変更するだけです。

そして、このバグを再現できた直後に、それを修正する方法を知っています. 私のセレクター関数の型は void (何も返さない) であるため、質問の内容を (「id」を使用して) コピーするだけではいけません。

変更することにより:

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

に:

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

直ります!! または、 github のこのコミットのおかげで 1 行のコード:

((void(*)(id, SEL, id))objc_msgSend)(self.target, self.successAction, category);
于 2014-02-18T14:08:53.053 に答える