問題タブ [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.

0 投票する
1 に答える
955 参照

ios - [型保持ではありません]: 割り当て解除されたインスタンスに送信されたメッセージ、目的の c

次のようにして、ビューをグラデーションでカスタマイズし、uilabel を追加しています。

シミュレーターで実行しているとき、期待どおりにすべてが正常に機能しています。ただし、デバイスにインストールすると、アプリがクラッシュし、

なぜこの問題が発生するのか、何か考えはありますか?

0 投票する
1 に答える
57 参照

ios - ブロックが視界を遮っている

私がこれをするとします:

次に、xcode はこのエラーを私に与えます: このブロックでビスタを強力にキャプチャすると、保持サイクルが発生する可能性があります

誰かが vista をこのように宣言することを提案しました

しかし、問題はこれです。vista 変数は数行下のプロパティに割り当てられます。

これは非原子的で強力なプロパティです。

どうすれば解決できますか?それを使用する一時的な id 変数を宣言できますが、これは不十分な解決策のようです。

何か考えはありますか?

0 投票する
3 に答える
2543 参照

ios5 - コア データ - 親コンテキストの保持サイクルを中断する

Core Data モデルに Departments と Employees という 2 つのエンティティがあるとします。
Department は Employees と 1 対多の関係にあります。

次の ManagedObjectContexts があります:
- ルート: 永続ストア コーディネーターに接続されてい
ます - メイン: 親ルートを持つコンテキスト

Employee を作成したいときは、次のようにします。
- Main コンテキストに Department があります
- Main コンテキストに Employee を作成します
- Department を Employee の department プロパティに割り当てます -
Main コンテキスト
を保存します -ルート コンテキスト

これにより、Main コンテキストと Root コンテキストの両方で保持サイクルが作成されます。

refreshObject:mergeChanges子コンテキストなしで (すべてルート コンテキストで) これを行った場合、Employeeを呼び出して保持サイクルを中断できます。2 つのコンテキストがある私の状況では、そのメソッドを使用してメイン コンテキストのサイクルを中断することはできますが、ルート コンテキストのサイクルを中断するにはどうすればよいでしょうか?

補足:これは私の問題を説明する簡単な例です。Instruments では、割り当て数が増えていることがはっきりとわかります。私のアプリでは、保存しているコンテキストごとに保持サイクルを持つ新しいエンティティ割り当てを取得するため、1 レベルよりも深いコンテキストがあり、さらに大きな問題を引き起こしています。

Update 15/04: NSPrivateQueueConcurrencyType と NSMainQueueConcurrencyType
両方のコンテキストを保存した後refreshObject:mergeChanges、Main コンテキストで Department オブジェクトを使用して実行できます。これにより、予想どおり、Department オブジェクトが再フォールトし、保持サイクルが中断され、そのコンテキストで Department および Employee エンティティの割り当てが解除されます。

次のステップは、ルート コンテキストに存在する保持サイクルを断ち切ることです (メイン コンテキストを保存すると、エンティティがルート コンテキストに伝播されます)。ここで同じトリックを実行しrefreshObject:mergeChangesて、ルート コンテキストで Department オブジェクトを使用できます。

奇妙なこと: これは、ルート コンテキストが NSMainQueueConcurrencyType で作成された場合 (すべての割り当てが再フォールトされ、解放された場合) は正常に機能しますが、ルート コンテキストが NSPrivateQueueConcurrencyType で作成された場合は機能しません (すべての割り当ては再フォールトされましたが、解放されていません)。 )。

補足: ルート コンテキストのすべての操作は、 performBlock(AndWait) 呼び出しで行われます

2004 年 15 月更新: パート 2 NSPrivateQueueConcurrencyType
を使用してルート コンテキストで別の (変更がないため役に立たない) 保存またはロールバックを行うと、オブジェクトの割り当てが解除されたように見えます。これが NSMainQueueConcurrencyType と同じように動作しない理由がわかりません。

Update 16/04: デモ プロジェクト デモ プロジェクト
を作成しました: http://codegazer.com/code/CoreDataTest.zip

2004 年 21 月更新: 行き方
Jody Hagings さん、ご協力ありがとうございます。ManagedObjectメソッド
から移動しようとしています。refreshObject:mergeChangesdidSave

次の違いを説明していただけますか。

上のものはオブジェクトの割り当てを解除しませんが、下のものは割り当てを解除します。

0 投票する
2 に答える
2362 参照

objective-c - ブロック / ブロックでweakSelfを使用する場合のEXC_BAD_ACCESS

私は保持サイクルを完全に理解していないと思うので、しばらくの間この問題に苦労してきました。私はこれにまったく慣れていないので、それについてもっと学ぼうとしています。

次のコードで EXC_BAD_ACCESS メッセージを取得しています。

self.successBLock(); を使用するだけで保持サイクルに関する 2 つの警告が表示されるため、weakSelf の使用を開始しました。正確な警告は次のとおりです。

多分私は弱いものを使うことさえ気にすべきではありませんが、私はこれについて確信が持てません.

これは、ブロックでweakSelfを使用する部分です:

これは、ブロック プロパティを割り当てる方法です。

0 投票する
10 に答える
24481 参照

objective-c - 保持サイクルを防ぐための NSTimer ターゲットへの弱参照

私はNSTimerこのようなものを使用しています:

もちろん、NSTimer保持サイクルを作成するターゲットを保持します。さらに、 UIViewController ではないので、タイマーを無効にしてサイクルを中断できるselfようなものはありません。viewDidUnloadしたがって、代わりに弱い参照を使用できるかどうか疑問に思っています。

タイマーを無効にする必要があると聞いたことがあります(実行ループから解放すると思います)。しかし、dealloc でそれを行うことができますよね?

これは実行可能なオプションですか?人々がこの問題に対処する多くの方法を見てきましたが、これは見たことがありません。

0 投票する
1 に答える
93 参照

iphone - ブロック内のオブジェクトに対する Apple デキュメンテーション

この問題に関する Apple のドキュメントには、次のように記載されています。

ブロックがコピーされると、ブロック内で使用されるオブジェクト変数への強力な参照が作成されます。メソッドの実装内でブロックを使用する場合:

参照によってインスタンス変数にアクセスすると、self への強い参照が作成されます。

インスタンス変数に値でアクセスすると、変数への強い参照が作成されます。

コード例があります:

しかし、私には意味がありません。インスタンス変数に値でアクセスするにはどうすればよいですか? いつも参照経由でアクセスしていませんか?self.myVariableそれであろうとなかろうとid newName = self.myVariable、それは常に参照によるものです。

次に、この例は、それらが何を意味するのかあまり明確ではありません。最初のケースでは自己保持され、2 番目のケースでは保持されないのはなぜですか? どこでも使用されていないのに、なぜブロックがそれをキャプチャするのでしょうか?