問題タブ [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 - SplitView に 2 つのビューを設定して相互参照を保持するのは悪いことですか?
私は現在、splitViewController のビューが互いに通信しなければならない RSS プログラムを作成しています。どちらも現在、以下で説明するように App Delegate で宣言されている互いのプロパティ インスタンスを保持しています。これが悪いプログラミング手法であるかどうかを知りたいのですが、そうでない場合、それを回避するにはどうすればよいですか?
/ ---------------------------------------------- /
objective-c - GCDdispatch_asyncブロック内からsuperを呼び出す:安全ですか?
私は少し漬け物になっています。ブロック内から[selfmethodName]を呼び出すと、保持サイクルが発生することを知っています。
ただし、このクラスではマルチスレッドが原因で、ブロックがアクセスしているメソッドをブロック以外の場所から実行することを許可できません。重大な問題が発生する可能性があるためです。
現在のコード:
まさにそれを行い、[selfgetmethod]を呼び出します。ディスパッチされたブロックがこのメソッドを実行することは問題ありませんが、このクラスの外部でこのメソッドを呼び出すことは望ましくありません。したがって、この継承されたメソッドをそのままオーバーライドしても問題ありません。
次に、ブロックを次のように変更します。
私はそれを試しましたが、[self getMethod]を呼び出さなくても機能しますが、スーパーは保持され、適切に解放されますか?はい、ARCを使用しています。ブロック内でsuperを呼び出すと、問題が発生しますか?代わりに__weakをsuperにするためのハックはありますか?
または、[self getMethod](継承されます)への直接呼び出しを禁止し、内部でのみ使用するにはどうすればよいですか?Objective-Cがこれを正確に実装していないことは知っていますが、実装ファイルでのみメソッドを宣言して実装するなどのトリックがあることは知っています。
編集#1:
SEL&IMPと関数ポインタを試してみました。問題は、IMPおよび関数ポインターがパラメーターとしてインスタンスを必要とし、これによりホールポイントがミュートになることです。
これは単に継承されたメソッドを呼び出します。スーパーで使用しようとすると、エラーが発生します。この時点で、先に進み、ブロック内でsuperを使用し、プロファイルを作成して、保持サイクルにつながるかどうかを確認します。
編集#2:
newacctの回答に基づいて、これが私がやったことです。
実際にはまだプロファイルを作成していませんが、これによって保持サイクルが回避されることを期待しています。
ios - クラス保持数
ブロックを使用したリテイン サイクルの回避については、ここにたくさん投稿されていますが、クラスやクラス メソッドを使用する場合はどうでしょうか。次のようなクラスがあるとします。
そして発信者はこれを言いたいです:
呼び出し元は MyClass の unsafe_unretained コピーを宣言する必要がありますか? それとも、保持カウントを増加させないシングルトンのようなクラスですか? とにかく常に存在させたいので、クラスの保持カウントを月に送信しても問題はありませんか?
ios - ARC を使用しない場合の __weak の代用
次のコード行があります。
このコンパイラエラーを引き起こしている:
これは、ARC を有効にしていないためです (まだ切り替えの準備ができていません)。したがって、別の StackOverFlow の質問から、次の使用が推奨されました。
これによりエラーは解消されますが、私が使用しているコンテキストでは機能しません(興味がある場合は、この質問を参照してください: How to cancel NSOperationQueue )。
私の質問は、__weak
この警告を取り除くために、このインスタンスでキーワードを何に置き換えることができるかということです。を使用すると、すべてが実際に正しく動作し__weak
ますが、iOS の将来のバージョンでは持ちこたえられないのではないかと心配しています。
ios - ウィーク ポインターで getter を呼び出してメソッドに渡すときにサイクルの可能性を保持する
私は一日中保持サイクルについて詳しく読んでいて、混乱し始めています。だから、いくつかのことを確認したかっただけです。(明確にするために、私はARCを使用しています)
だから私が持っているとしましょうMyFirstClass
。MyFirstClass
には (デフォルトで) を強く指すインスタンス変数がありますMyChildClass
:
MyFirstClass
次のような getter (.h で公開されています) もあります。
ここで、完全に別のクラスがあるとしましょうMySecondClass
。次のようにMySecondClass
指す弱いインスタンス変数があります。MyFirstClass
両方を保持する親クラスがありMyFirstClass
、弱い参照を持っているだけなMySecondClass
ので、必要なときに親クラスがそれを解放するのを止めません。MySecondClass
MyFirstClass
MySecondClass
独自の子クラスもあり、インスタンス変数でも強く参照されます。
MySecondChildClass
MyFirstClass
のMyChildClass
オブジェクトを参照したい。
したがって、ここでも弱いポインターを使用していると思いますMySecondChildClass
。
これを設定するためのカスタム init があります。
最後に、MySecondClass
を作成するメソッドがありますMySecondChildClass
。
これはすべて正しいですか?90% 大丈夫だと確信していますが、混乱しています。
を使用しているときはどうですか_firstClass.child
、それへの強力なポインターが作成されますか? __weak
そのメソッド呼び出しのどこかを参照する必要がありますか? MySecondChildClass
の初期化中はどうですか?インスタンス変数を設定する前に一時的なポインターがMyChildClass
ありますが、心配する必要がある強力なポインターを作成しますか?
どんな明確化も素晴らしいでしょう。
ios - iOSブロック。ブロックセッター内からオブジェクトインスタンスを参照するにはどうすればよいですか?
ブロックを指すプロパティを持つオブジェクトがあります。
プロパティをブロックで初期化します。私の中でblock
私はオブジェクトインスタンスを参照します:
ただし、保持ループに関するコンパイル警告が表示されます。
これを行う正しい方法は何ですか?
ありがとう、ダグ
objective-c - ランキング リクエスト、ネストされたブロック、保持サイクル
iPhone ゲーム用のリーダーボード表示クラスを開発しました。このクラスには、次のインスタンス メソッドがあります。
ご覧のとおり、このメソッドはリーダーボード リクエストをコピーして実行し、提供された完了ハンドラを呼び出します。私のゲームのレイヤーは、このメソッドを次のように呼び出します。
レイヤーとディスプレイの両方の割り当てが解除され、リクエストが完了していないと、ゲームがクラッシュします。リクエストが完了すると、割り当てが解除されたインスタンスにメッセージを送信しようとし、クラッシュが発生します。リーダーボードのリクエストをキャンセルすることはできますか? そうでない場合、メモリリークを引き起こさずにクラッシュを回避する方法はありますか?
objective-c - Objective-C /ブロック-これは保持サイクルではありませんか?
-longRunningTaskWithCompletion:
のブロックが(文字列プロパティを設定するために)ブロック内の自己をキャプチャし、そのブロックをディスパッチキュープロパティに追加するため、このコードは保持サイクルを作成すると思います。
objective-c - ARCを使用してself.managedObjectContextでperfromBlockを呼び出すときにサイクルを保持しますか?
以下のコードでは、保持サイクルの問題を正しく理解していますか?保持サイクルはありますか?
ios - 「このブロックで「ブロック」を強くキャプチャすると、保持サイクルが発生する可能性があります」を修正する方法
私はこのコードに取り組んでいます。これはネット上で長い非同期操作を実行し、終了すると完了ブロックをトリガーしてテストを実行し、変数が特定の値を取得した場合、別の長い操作をすぐに開始する必要があります。
このコードを使用すると、コンパイラから次の警告が表示されます。
私が変更され:
の:
しかし、私はこの他の警告を受け取ります:
どうすればこれを修正できますか?
ありがとう
ニコラ