3

xcodeをバージョン4.5.1にアップグレードしました。
以前はすべて正常に機能していましたが、プロジェクトをアーカイブすると、xcodeがスタック/ハングし、アーカイブが終了しなくなりました。
上のステータスでは、テキストには次のように書かれています。

10個のソースファイルのうち10個をコンパイルしています...

その後は何も起こりません。立ち往生しているだけです。
コードを(アーカイブせずに)コンパイルしてビルドすることはできますが、シミュレーターではすべてが正常に実行されます。

xcodeを再インストールしました。その後も問題は発生します。
任意の提案が適用されます。

詳細:
特定のコード行に問題を特定しました:
CGRect tmpFrame3 = seeDetailsButton.frame;
この行に問題はありません...
シミュレーターでビルドおよび実行すると正常に動作するのに、アーカイブすると失敗するのはなぜですか?

4

4 に答える 4

6

私はここで何が起こっているのか理解しました。
まず、アーカイブプロセス自体ではなく、リリースモードでのビルドに関連しています。
アーカイブ中に問題が発生した理由は、リリースモードでビルドされるためです。

問題自体について:xcode4.5.1
にはある種のAppleコンパイラのバグがあるようです。
AppleLLVMコンパイラ4.1を使用しています。コンパイル中は、さまざまな最適化レベルがあります。
デバッグ中-最適化は「なし」に設定され、オフになっています。リリースでは、「最速、最小[-Os]」に設定されています。リリースモードで最適化をオフにすると(「なし」に設定)、問題は発生しません。

より詳しい情報:
コードを掘り下げて、最適化中にコンパイラのバグが発生する原因を突き止めようとしたところ、次のことがわかりました。

__weak ProfileButton *tmp = myButton;

ProfileButtonが単なる通常のボタンである場合、UIButtonから継承します。
私が削除すると、__weakすべてがうまく機能します。コンパイラの最適化を「最速、最小[-Os]」に設定した場合でも。

于 2012-10-20T12:26:05.063 に答える
0

最近、これと同じ問題に直面し、コンパイル中にXcodeが最終ファイルにぶら下がっていました。上記の問題と同じように、リリースの最適化レベルをNone([-O0]でデバッグモードに一致)に設定すると、アーカイブを正常に実行できます。

ただし、私たちのコードでは、特定のバグは自己をキャプチャしているブロックに関連付けられていました。Appleのガイドラインによると:

「コールバックブロックを定義するときなど、ブロック内で自分自身をキャプチャする必要がある場合は、メモリ管理の影響を考慮することが重要です。

ブロックは、自己を含むキャプチャされたオブジェクトへの強力な参照を維持します。つまり、強力な参照サイクルになりやすいということです...」

したがって、該当する場合は、コードでこれを確認し、Appleのベストプラクティスに従って、自己への弱参照をキャプチャしてください(ドキュメントの例)。

于 2013-09-25T08:11:32.513 に答える
0

私の場合、循環サブクラスを作成しました

まるで

@interface BaseTableViewController : PaymentTableViewController 

@interface PaymentTabelViewController : BaseTableViewController

私がしたことは最後のサブクラスを更新することだったので、今は次のようになっています:

@interface TopTableViewController : PaymentTableViewController 

@interface PaymentTableViewController : BaseTableViewController 
于 2014-03-15T22:44:11.450 に答える
0

私の場合、ソースファイルの1つに次のような非常に大きな配列の宣言が含まれているときに問題が発生しました。

NSArray<NSArray<NSNumber *> *> *points =
    @[
        @[@38.576732f, @-90.230682f, @1495320246], // 1 item
        ...
        @[@37.478034f, @-89.524851f, @1495336147] // 3000 item
    ];

約3000個のアイテムがありました。ソース行を小さな行に分割しても効果はありません。

アイテムをCSVファイルに配置し、実行時に解析することで修正しました。

別のアプローチは、より小さな配列に分割し、実行時に連結することです。

于 2017-08-01T19:34:38.090 に答える