問題タブ [autorelease]
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.
iphone - 何度も使うクラスメソッドがリークの原因?
私がゲームを開発しているとしましょう。次のクラス メソッドを何千回も実行します。
NSBundle *bundle=[NSBundle mainBundle];
自動解放プールを作成せず、上記のクラス メソッドを呼び出すオブジェクトを常に解放します。オブジェクトを作成し、それが上記のクラス メソッドを呼び出し、それを解放し、何度も何度も繰り返します。
3 つの質問:
- メモリリークですか?
- 私が走った場合:
NSAutoReleasePool *pool=[[NSAutoReleasePool alloc] init]; [プールドレイン];
クラスメソッドで作成されたすべてのNSBundleを効果的に解放しますか?
- 私が書いた場合:
プール=ゼロ;
書く代わりに:
[プールドレイン];
同じ効果が得られるでしょうか?これは良い習慣ですか?
3つの質問は相関しており、それらを明確にするものを後押しします:)
objective-c - NSStringの自動解放
私はこの文字列を解放する責任がありますか?それはデフォルトで自動解放されますか?
c++ - Objective-Cの自動リリースの適切な使用?
私は Objective-C を学んでおり、Vector3D クラスを作成しようとしています。
C++ または Java では、実装したい関数は次のようになります。
現在、objective-c ではオブジェクトを返すことはできず、オブジェクト ポインターのみを返すことができます。これは autorelease を使用する適切な場所でしょうか (戻る前に?)。これにより、Vector3D クラスのメソッドを連鎖させることができます (多くのメソッドがオブジェクト自体を返すため) が、オブジェクトを手動で割り当てて解放するのに比べて、これは特に非効率的でしょうか? Objective-C でオブジェクトを返すために使用される他の一般的なパターンはありますか?
クラスでやりたい操作の例:
ありがとう。
objective-c - 実行時間の長いバックグラウンド スレッドで自動解放プールを定期的に排出する最良の方法は?
開発者向けドキュメントでは、次のように述べています。
アプリケーションまたはスレッドの寿命が長く、自動解放されたオブジェクトを大量に生成する可能性がある場合は、定期的に自動解放プールを排出して作成する必要があります (アプリケーション キットがメイン スレッドで行うように)。そうしないと、自動解放されたオブジェクトが蓄積され、メモリ フットプリントが大きくなります。ただし、切り離されたスレッドが Cocoa 呼び出しを行わない場合は、自動解放プールを作成する必要はありません。
これを行う最善の方法は何だろうと考えていました。うまくいくと思ういくつかの方法がありますが、どれが「最良」かわかりません。現在、スレッドを開始し、操作の実行を待機するメソッドがあります。
私が考えることができる私のオプションは次のとおりです。
1) while(accessoryThreadIsRunning) にカウンターを追加して、50 回または 100 回ごとに自動解放プールを空にし、新しいプールを作成します。
2) そのスレッドでメソッドを実行するたびに (performSelector: onThread: を使用)、自動解放プールを作成し、メソッドの最後でそれを解放できます。
3) プールが定期的に排出されてから作成されるようにタイマーを作成します。
オプション1が最適だと思いますが、これを行う別の方法があるかどうかを知りたいです。ありがとう!
iphone - オブジェクトを「保持」しなくても正常に機能するのはなぜですか?
ここでは、「test」メソッドで「tempString」の自動解放を使用しました。ルールに従って、メインで「[一時保持]」を使用する必要があります。しかし、私はそれを使用しませんでした。それでも問題なく動作し、出力を印刷します。では、「保持」の必要性は何ですか?誰でも理由を教えてもらえますか?前もって感謝します。
iphone - iPhoneアプリのEXC_BAD_ACCESS-メモリ管理の問題
参考までに、私はすでに読んだ:
私はそれが役立つと思いました:)。
このアプリは教育ツールであり、人々が単純な遺伝学を視覚化するのを助けることを目的としています。変数名などが意味をなすように、いくつかの背景があります。アプリの実行時に実行されるメインコードは次のとおりです。
そして、これをさまざまな方法で実行するとどうなりますか?
- ブレークポイントなしで実行すると、2番目のsleep()の後、「ラウンド3」NSLogの前に、コンソールメッセージなしでクラッシュします。
- ブレークポイントを有効にして実行しますが、定義されていない場合は、シーケンス全体を実行します。4番目のsleep()の後、EXC_BAD_ACCESSでクラッシュします。
- ブレークポイントを有効にしてNSZombiesEnabledで実行すると、上記と同じことを実行します。これ以上の情報はなく、EXC_BAD_ACCESSだけです。
- Instrumentsで実行している場合、リークは表示されません。
これは、4回呼び出されるルーチンです。
コード全体を貼り付けないと、possiblesByMatingFather:withMother:mutations関数はNSMutableArrayを返します。そのルーチンは、以下を使用して配列を宣言します。
それから:
可能性に対してリリースまたは自動リリースメッセージを送信しません。私の理解では、私が持っている方法で配列を作成することは、暗黙の自動解放です。配列を返すので、配列を割り当てたくありませんでした。そのため、明示的に解放する機会がありませんでした。
可能性NSMutableArrayに保持されているオブジェクトは、カスタムクラスです。それらは次のように追加されます。
これはほとんどの場合うまくいくようです。少なくとも、ブレークポイントが有効になっている場合、プログラムは、上記のように、最後まで文句なしにコードを実行します。
ここで、私が間違っていることについて何か提案はありますか?明らかにある種のメモリ管理の問題ですが、頭の中で分類することはできません。
ところで、無駄に、壁に物を投げてそれを理解しようとして、私はメインルーチンから1行を次のように変更しました:
無駄に。同じ結果。したがって、問題は、possiblesByMatingFather:withMother:mutationsによって返される配列を保持することではありません。そのリターンを保持することを強制することは役に立ちません。
objective-c - 多くの自動解放された変数を持つ関数のメモリフットプリントを削減しますか?
私はまだObjective-Cのメモリ管理のニュアンスのいくつかに頭を悩ませており、私が確信していない次のケースを思いついた:
ここで、decimalNumberByMultiplyingByとdecimalNumberBySubtractingは、多くのNSDecimalNumbersを作成します。これは、私が理解しているように、最終的には自動解放されますが、それまでは、含まれているプログラムが非常に多くのメモリにハングアップするのではないかと心配しています。
どこかに自動解放プールを導入する必要がありますか?(もしそうならどこで?)それはパフォーマンスに顕著な影響を与えるでしょうか(使用中の大量のメモリの副作用と比較した場合)?
ここで使用する適切なメカニズムは自動リリースですか?ループを分割して、メモリを手動で解放することを検討する必要がありますか?
これはおそらくn00bの質問ですが、この状況でのベストプラクティスが何であるかを把握しようとしています。
ios - iPhone NSMutableArray および NSKeyedUnarchiver unarchiveObjectWithFile リリースの奇妙な点
を実装するカスタム オブジェクトの配列 (NSMutableArray) をアーカイブします。ファイルから保持プロパティ @property (非アトミック、保持) NSMutableArray *buddies; にロードしたら、オブジェクトのリリース カウントは 2 です (正しい、それは autorelease の 1 + プロパティの保持の 1 です) が、誰もそれをリリースせず、保持カウントが 1 になったので、私がそれをリリースすると、-[__NSArrayM 保持カウント]: メッセージが送信されました。割り当て解除されたインスタンス (1 つの保持カウントが自動解放であるためだと思います)
完全なコードは次のとおりです。
BuddieListViewController.h
BuddieListViewController.m
なぜこれが起こるのか誰にも分かりますか?
objective-c - Objective-Cの初期化(静的メソッド)が複数回呼び出されましたか?
私はObjective-Cでこれに似たコードを持っています:
これはコード全体で参照されていますが、これへのポインタは、コード全体でどこでも使用しているため、変更されることはありません。問題は、 を使用してテストを実行するGHUnit
と、 のポインターが変更されるという奇妙な問題が発生するGlobalVariableThatShouldNeverChange
ことです (つまり、再初期化されます。自動解放プールを介して変数が解放されるという問題があり、それは修正されました。この問題の回避策がありますが、その理由を知りたいですか?
ありがとうございました!
iphone - iPhone-substringToIndex / substringFromIndex/substringWithRangeメモリリーク
Instrumentsリークは、このコードがリークすると言っています:
名前はリークオブジェクトです。奇妙なことがいくつかあります。リークするのは時々だけで、常にではありません(このコードスニペットは、アプリの通常の実行中に数百回実行されますが、リークは3〜4回だけです)。もう1つの奇妙なことは、名前オブジェクトが自動解放オブジェクトであり、明示的に保持または解放されることはないということです。それでは、どのようにしてリークされたのでしょうか。
スタックを見ると、substringWithRangeはsubstringToIndexによって呼び出されるので、問題はsubstringToIndexメソッドにあると思います。