問題タブ [retain-cycle]
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.
ios - デリゲートの保持が間違っている理由すべての選択肢は何ですか...?
1つの問題があります。AとBがAユーザーからBビューコントローラーへの2つのビューコントローラーであると仮定します。Bでは、ユーザーはオブジェクトC(NSObjectクラス)を作成してダウンロードを開始し、BをC(割り当て)へのデリゲートとして設定します。ユーザーがAに戻り、Bのダウンロードがオブジェクトを解放し、Cデリゲートがコールバックを返すことができない(クラッシュ)。コールを取得して、ユーザーが他のView Controllerに移動できるようにしたいのですが、Cクラスでデリゲートを保持していますがデリゲートの保持が間違っています...
前もって感謝します。
ios - ivarがnillされた後でもivarがブロックを保持するのはなぜですか?
次のような構造があります (ARC コード):
問題は、self が完全に解放されないため、オブジェクトの割り当てが解除されないことです。self を weakSelf バージョンに置き換えると、オブジェクトの割り当てが正常に解除されます。
「保持している」ブロックが解放され、オブジェクトの割り当てを解除できるように、ivar を nil する方法はありますか?
ios - void *のブロック内の保持サイクルを解決するにはどうすればよいですか?
iOSアプリにリンクされているC++静的ライブラリがあります。私のコードからライブラリによって提供されるいくつかのアクションにアクセスするために、私はそれにvoid*を持っています。問題は、プロジェクトでARCをアクティブにしたところ、void*が保持サイクルと呼ばれるブロックで生成されると叫ぶことです。
保持サイクル警告を生成するコードは次のようになります。
パラメータとしてlibInstanceポインタを関数に渡すと、次のような警告が表示されます。
このブロックで「自己」を強くキャプチャすると、保持サイクルにつながる可能性があります
私がこのようなことをしようとすると:
以下のような警告が表示されます。
これはかなり明確です..問題は、この保持サイクルをどのように乗り越えるかです。ポインタはありますか?
objective-c - ブロック、自己、保持サイクル
ブロック内で自分自身を参照することに頭を悩ませて、保持サイクルを作成しないのに少し問題があります。
私の理解が正しいかどうか教えていただけますか?
ブロック内で自分自身を参照すると、保持サイクルが作成されます。代わりに、ブロック外で自分自身への弱参照を作成してから、ブロック内でその弱参照を使用する必要がありますか?
ありがとう!
objective-c - ブロック保持サイクルで関数を呼び出す
ブロック内から呼び出した関数が「自己」を参照すると、保持サイクルが発生しますか?
「secondFunction」で「self」を呼び出しています。この関数に弱いポインターを渡して代わりに使用する必要がありますか?
objective-c - プログラムでオブジェクト階層の保持サイクルを検出するための戦略は何ですか?
Cocoa のビュー階層とは異なり、オブジェクトの階層を作成する ARC 対応のフレームワークを作成しています。各コントローラ オブジェクトは、複数のサブコントローラを持つことができます。コントローラーは相互に参照している可能性があり、保持サイクルが発生する潜在的なリスクがあります。
保持サイクルを回避する方法を知っています。保持サイクルが存在し、オブジェクトの割り当て解除を妨げていることをプログラムで検出する方法があるかどうかを知りたいですか?
ある時点で、既存のルート コントローラーは新しいルート コントローラーに置き換えられます。ARC を使用しているため、retainCount を使用して既存のコントローラーの保持カウントを確認することはできません。とにかく私が読んだことから、これは信頼されるべきではありません。
ルート コントローラに 2 つのサブ コントローラがあり、それぞれが相互に強い参照を持つテスト セットアップがあります。その場合、ルート コントローラーは dealloc を実行せず、ルート コントローラーが新しいコントローラーに置き換えられたときに他の 2 つのコントローラーも実行しません。予想通り。このシナリオを考えると、そのルート コントローラーが実際に割り当てを解除したかどうかを判断する何らかの方法があるはずだと考えていました。
考えられる解決策:コントローラーを交換する直前に、交換対象のルート コントローラーをグローバル オブジェクトのゼロ設定の弱いプロパティに割り当てました。次に、タイマーを設定して、プロパティが nil かどうかを一瞬で確認できるようにしました。nil の場合、コントローラは割り当てを解除しました。nil でない場合は、階層内のどこかで保持サイクルが原因である可能性が高いメモリ リークを示している可能性があります。その場合、交換されたコントローラーが nil でない限り、開発者の注意を引くためにログ ステートメントを出力します。
これは機能しますが、代替の (より良い) ソリューションはありますか? または、このソリューションで考えられる警告はありますか?
具体的には、オブジェクトの割り当てが解除されるまでにどれくらいの時間が経過する可能性がありますか?これは瞬時に行われることが保証されていますか?それとも割り当て解除を遅らせることができますか?
objective-c - ARCでサイクルを保持
私は非ARCベースのプロジェクトに取り組んだことはありません。ARCベースのプロジェクトでゾンビに出くわしました。保持サイクルが原因であることがわかりました。保持サイクルとは何でしょうか。
保持サイクルの例を教えてください。
objective-c - ARC、NSOperationQueue、dispatch_source_t(タイマー)でサイクルを保持する
シリアルNSOperationQueueに操作を追加するメソッドがあります。定期的にメソッドを呼び出したいので、ディスパッチソースタイマーを使用します。
ただし、このメソッドは、ユーザーのアクションに応じて呼び出すこともできます。これが発生した場合(たとえば、タイマーが原因でメソッドが呼び出される少し前)、タイマーの起動日を延長します。
問題は、私が書いたコードに保持サイクルがあり、どこにあるのかわからないことです。
問題を示す縮小例を次に示します(デプロイメントSDKを10.7に設定することを忘れないでください)。
objective-c - 「保持サイクルにつながる可能性が高い」という警告がないということは、強力な参照サイクルが作成されないことを意味しますか?
ARCリリースノートへの移行によると、ブロック内で自分自身を参照する場合は、強い参照/保持サイクルを回避するために弱い参照を使用する必要があります。
時々、ブロック内で自分自身を参照すると保持サイクルが発生する可能性があるというコンパイラの警告が表示されます。警告がないということは、保持サイクルが作成されないことを意味しますか?警告が保持サイクルにつながる可能性が高いと見なされるのはなぜですか?
ios - ブロックして保持するサイクルはそれをキャッチできません
ブロックと弱参照に問題があります。ARCの下にいます。私はクラスを作成しました。これは無料のプロジェクトで、Google Directions APIの一種の簡単なラッパーです。ここからダウンロードできます。プロジェクトへのリンク
ビューコントローラー内で使用しています。問題は、使用後のビューコントローラーが割り当てが解除されていません。コメントアウトするか、nilに設定すると、すべてが正しく機能するため、これはこのオブジェクトの問題だと思います。保持サイクルがどこにあるのか理解できません。もちろん、弱い自己に設定しました。これを使用するViewControllerのメソッドは次のとおりです。
ブレークポイントを設定してViewControllerのretainCountを要求すると、渡されたView Controllerがweakに設定されている場合でも、異なる時間に増分されることがわかります。どんな助けでも本当にありがたいです。
ありがとう、
アンドレア
/ * ** * ** * ** * ** UPDATE * ** * ** * ** * * / **
割り当てを確認するブロック内で、ビューコントローラが何度も保持されていることがわかります。 tillと呼ばれるメソッド-tryRetain
はデクリメントされますが、割り当て解除のために1つのリリースを見逃しているようです。念のため、渡されたブロックがクラスルート方向オブジェクトにコピーされることを指定する必要があります。ここからダウンロードできる小さなサンプルを作成しました:プロジェクトのダウンロード