問題タブ [release-builds]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
loops - ARC は、ループで作成およびディスパッチされるブロックで参照されるオブジェクトを過剰解放するようです
dispatch_async を使用してバックグラウンド スレッドに複雑な計算を実行しようとしていますが、ブロックで使用しているオブジェクトが過剰に解放されているようです。私はARCを使用しているので、保持と解放についてあまり気にする必要はないと思いましたが、私の場合、重要なものを見逃したか、ARCがオブジェクトを過剰解放しました。
問題が発生するのは次の場合のみです。
- forループでブロックを作成するdispatch_asyncを呼び出します
- ブロック外で作成したブロック内のオブジェクトを参照しています
- ループは少なくとも 2 回反復します (したがって、少なくとも 2 つのブロックが作成され、キューに追加されます)。
- RELEASE ビルド構成が使用されている (したがって、おそらく何らかの最適化に関連している)
関係ないようです
- シリアル キューかコンカレント キューか
- どのようなオブジェクトが使用されているか
この質問は、ブロックが RELEASE 構成でリリースされること ( iOS 5 のブロックは Release Build でのみクラッシュするように) に関するものではなく、ブロックで参照されているオブジェクトがオーバーリリースされていることに関するものです。
NSURL オブジェクトを使用して小さな例を作成しました。
for ループにない最初のブロックは問題なく動作します。ループの反復が 1 回だけの場合は、2 番目も同様です。ただし、指定された例では、2 つの反復が行われ、RELEASE 構成で実行するとクラッシュします。スキームで NSZombie を有効にすると、次のように出力されます。
URLByAppendingPathComponent
forループ内のブロック内の呼び出しでデバッガーが停止します。
同時キューを使用する場合、失敗した呼び出しは、実際にrelease
は呼び出しスタックに _Block_release がある呼び出しになります。
しかし、これはおそらくタイミングがわずかに異なるためです。
どちらのエラーも、によって参照されている NSURL オブジェクトがオーバーリリースされていることを示していると思いますtheURL
。しかし、それはなぜですか?私は何かを見逃していましたか、それとも ARC とブロックの組み合わせのバグですか?
私が期待するのは、dispatch_async
呼び出しの前または実装のいずれかでdispatch_async
(とにかく: for ループ内で、dispatch_async
-call ごとに 1 回)、ブロック内で参照されるすべての変数が保持され、(しかし、で)ブロック。
実際に起こっているように見えるのは、変数がコード内でretain
の出現に対して一度編集されるが、ブロックの最後で呼び出されるため、実行されるたびに呼び出されるため、ループ内の呼び出しよりも多くの呼び出しが発生することです。dispatch_async
release
release
retain
しかし、多分私は何かを見落としています。より良い説明はありますか?ブロックまたは ARC を何らかの方法で誤用しましたか、それともバグですか?
編集:参照された変数を for ループ内のローカル変数にコピーするという @Joshua Weinberg の提案を試しました。指定されたサンプル コードでは機能しますが、関数呼び出しが関係している場合は機能しません。
では、なぜケースでは機能するのに、他のケースでは機能しないのでしょうか? 違いがわかりません。
ios - 返される前にリリースされたARCの弱いivar-デバッグではなくリリース用にビルドする場合
オブジェクトを遅延して作成し、それを弱いプロパティとして格納するクラスがあります。他のクラスがこのオブジェクトを要求する場合がありますが、オブジェクトの割り当てが解除されないようにするには、明らかにオブジェクトへの強力な参照を保持する必要があります。
スキームがXcodeがデバッグ用にビルドするように設定されている場合、問題なく動作します。オブジェクトは呼び出しobjectManagerInstance.theObject
て戻ることができますtheObject
。
スキームがリリース用にビルドするように設定されている場合、次をtheObject
返しますnil
。
私の推測では、コンパイラーは_theObject
、アクセサーメソッド自体でそれ以上使用されていないことを確認してコードを最適化しているため、nil
戻る前にweak変数がに設定されています。変数を実際に返す前に、強力な参照を作成する必要があるようです。これは、ブロックを使用して行うことしか考えられませんが、面倒なので、避けたいと思います。
ivarがすぐに無効になるのを防ぐためにreturnタイプで使用できるキーワードの種類はありますか?
android - Android NDK でビルドされた共有ライブラリからシンボルを削除することはできますか?
Android NDK を使用して Java アプリで使用する共有ライブラリを構築しています。を使用readelf
してリリース ビルドによって生成されたファイルを検査するlib/armeabi-v7a/libXXXlib.so
と、ネイティブ C/C++ コードのすべてのシンボル (関数、変数名) が含まれているように見えます。
実際、共有オブジェクト ファイルは、デバッグ ビルドとリリース ビルドで同じように見えます。(フォルダー内の出力の唯一の違いは、およびファイルが作成されlibs
ているかどうかです。) NDK によって設定された最適化を myで上書きしていますが、リリース ビルドがデバッグ シンボルを生成することは期待できません。フラグを含めて、それを行います。gsb.setup
gdbserver
APP_CFLAGS += -O3
Application.mk
-g
SO に関するコメントを見つけました。 libs/ directory"、および別の記述: 「名前がない場合、JNI は Java の関数を見つけることができません。」
ndk-build
で最終的に作成されたものよりもはるかに大きいため、確かにファイルから何かを取り除いていますが、それでもファイル内のすべての関数と変数の名前はそのまま残っているようです。obj/armeabi-v7a/libXXXlib.so
libs
すべての関数の名前は (ネイティブ コードへのエントリ ポイントだけでなく) JNI に必要ですか?
そうでない場合、不要なシンボルを削除するにはどうすればよいですか?
c# - Visual Studio リリース ビルドが機能しない
Themes/Generic.xaml で定義されたテンプレートを持つ C# でカスタム コントロールを作成しました。コントロール (Themes/Generic.xaml と共に) は、DLL に出力するプロジェクトで定義されます。これが重要かどうかはわかりませんが、コントロールはサブフォルダーにあります。
メインの実行可能ファイルからコントロールを参照するとOnApplyTemplate()
、コントロールの C# が呼び出されず、スタイル情報が適用されていない状態でコントロールが表示されます。
これはリリース ビルドでのみ発生します。デバッグ ビルドは正常に動作します。
コントロールをホストしているコントロールのリソース (Window.Resources など) でテンプレートを再定義すると、コントロールは正常に動作します。Visual Studio が Themes/Generic.xaml をコントロールにリンクしていないようです。
ios - アプリの提出は失敗するが、Corona SDK のデバッグ モードでバグを再現できない
iOS でのアプリの送信に関連して、この奇妙な問題が発生しています。基本的に、(開発者プロファイルを使用して) ビルドし、(テスト フライトを介して) テストすると、最も大規模なテスト ケースであっても、すべてが正常に機能します。
しかし、(iOS 配布プロファイルを使用して) ビルドし、Apple に提出すると、レビュー プロセスで、再現できないバグが原因で合格に失敗します。
したがって、私の最善の推測では、バグ/エラーはリリース ビルドでのみ発生していると思われます (おそらくコードの最適化が原因です)。
私はこれまでにアプリを2回送信しました(推測と修正の可能性があります)が、両方とも同じエラーで返されました。
リリース ビルドを使用してログをテストまたは確認するにはどうすればよいですか? (これまでのところ、DTS は有用な情報を提供するのに役に立たなかった)
/編集済み/
もう少し背景情報: これは、Corona SDK で作成されたゲーム アプリケーションです。コロナ SDK に精通している場合は、シーンが何であるかを知っています。
だから基本的に、
「ホーム シーン」があります。シーンに「開く」ボタンがあります。
開くボタンをクリックすると、スピナーが表示されます-> アプリが json ファイルを読み取ります-> 次のシーンに進みます。
レビュー プロセスで Apple が見ているのは、「ホーム シーン」の「開くボタン」をクリックすると、スピナーが表示され、それ以上何もしません。したがって、アプリはアップルの審査プロセスに合格していません。
注意: これはリリース モード (ディストリビューション プロファイルでビルド) でのみ発生し、デバッグ モード (プロビジョニング プロファイルでビルド) では発生しないため、再現できません。
apache-flex - エクスポートされたリリースにすべてのファイルとフォルダーが含まれていない Flex Release ビルド
アセット、VO、コントローラー、モデル、およびビューのフォルダーを含むプロジェクトのリリース ビルドをエクスポートしようとしています。リリース ビルドをエクスポートすると、フレックス ビルダーのプロジェクト ルートにあるすべてのファイルとフォルダーがリリース ビルドに含まれません。これには、主要なフレックス アプリケーション ファイルと、アセットおよびコントローラー フォルダーのみが含まれます。これを解決する方法はありますか?
ios - Apache Cordova Visual Studio 2015 Remotebuild iOS リリース > Http 404: インストールに失敗しました: プロビジョニング プロファイルを確認してください
remotebuild mac サーバーを使用して、Apache Cordova for Visual Studio 2015 で iOS のリリース モードでビルドすると、次のエラーが発生します。
2>Http 404: インストールに失敗しました: プロビジョニング プロファイルを確認してください
私の XCode アカウントにはプロビジョニング プロファイルがあり、'ios_distribution.cer' (セキュリティ証明書) がキーチェーンに追加されていることを確認しました。
XCode 7.2 と cordova CLI 4.3 を使用しています。iOS 9.2 を搭載した iPod Touch を Mac リモート サーバーに接続しています。デバッグ用のビルドに問題はありませんでした。
他の誰かがこの問題に遭遇し、解決策を見つけましたか?