問題タブ [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 - ARC とブロックの使用時にサイクルを維持する
オブジェクトメソッドが完了引数としてブロックを受け取るときの私の理解から、ブロックで「自己」を送信できます。
しかし、このオブジェクトがブロックを「保持」する (将来の使用のために保存する) 場合、自分自身の「弱い」コピーを送信する必要があります。
しかし、次のような変種も見ました:
そして、この最後のバリアントを実行する理由/時期が明確ではありません
objective-c - iOS - CoreData を使用した dispatch_async 保持サイクル
私はdispatch_queueを初めて使用し、バックグラウンドでCoreDataに保存しようとして問題に遭遇しました。CoreData プログラミング ガイドを読み、NSManagedObjectContext
バックグラウンド スレッドで別のスレッドを作成しています。テスト プロジェクトで sを作成する単純なループを実行するとNSManagedObject
、問題は発生しません。オブジェクトが作成され、 を使用しNSManageObjectContextDidSaveNotification
て変更をメイン スレッドに伝えます。
私の問題は、GCD を知らないことにあると思います。XML を解析していますparserDidEndDocument:
が、UI をブロックせずにデータを CoreData に保存する必要があります。このブロックが使用されるたびに、アプリのメモリが手に負えないほど雪だるま式に増え始め、最終的Terminated app due to memory pressure
に
注: AppDelegate のシングルトンを使用して my を保持し、NSPersistentStoreCoordinator
stuffToSave はNSMutablearray
パーサーによって作成されます。
どんな方向性でも大歓迎です。私は2日間頭を殴っています!
編集 1:NSManageObjectContextDidSaveNotification
解析を行っている場所とは異なるクラスから
リッスンしています。私が持ってviewDidLoad
いる:
次に、Apple の「ThreadedCoreData」の例から以下を使用しています。
ios - iOS ARC ブロック保持サイクル
以下のブロックが保持サイクルに変わっているかどうか誰か確認できますか? このブロックは、SampleClass1 ではなく SampleClass2 によって呼び出されていることに注意してください。
ios - UIViewController から呼び出された保持されない完了内で自己を参照する場合、weakSelf/strongSelf ダンスは本当に必要ですか?
UIViewController
サブクラス内に次のメソッドがあるとします。
self
ブロック内への参照により、UIViewController
インスタンスがブロックによって保持されることはわかっています。performAsyncNetworkCallWithCompletion
のプロパティ (または ivar) にブロックを保存しない限り、NetworkService
保持サイクルがないと考えるのは正しいですか?
performAsyncNetworkCallWithCompletion
上記の構造により、システムによって以前にリリースされたとしても、終了するまで UIViewController が保持されることになります。しかし、 ( iOS 6 が aのバッキングメモリを管理する方法が変更されUIViewController
た後) システムが my の割り当てを解除する可能性は高いでしょうか (または可能でしょうか? )。UIViewController
CALayer
「weakSelf/strongSelf ダンス」をしなければならない理由があるとすれば、次のようになります。
しかし、これは無意識に醜いので、必要がない場合は避けたいと思います。
ios - 変更をマージする際に Core Data のマルチスレッド保持サイクルを解除するにはどうすればよいですか?
私のアプリケーションでは、ストレージに CoreData を使用し、NSFetchedResultsController を使用してデータを表示しています。
私は raywenderlich のチュートリアルに従ってそれを完成させました。それは大量のコードですが、一般的には適切に機能しています。必要に応じてその一部を投稿します。私は理解できない問題に固執しました。
NSFetchedResultsController と組み合わせた UITableView 内に表示されるデータは、バックグラウンドで更新できます-ここで私の問題が始まりました。
Pull-to-refresh アプローチを行っており、別のスレッドでバックグラウンドでダウンロードを開始しています。このスレッド用に作成された独自の NSManagedObjectContext を使用し、すべてのオブジェクトが作成された後に保存します。
コードは次のとおりです。
Apple docs で読んだことによると、メインスレッド NSManagedObjectContext でこれらの変更を検出する適切な方法は次のとおりです。
基本的に、managedObjectContext の変更に関する通知を受け取ると、変更をメイン スレッド コンテキストにマージします。そして、それは一般的に機能しますが、プロファイリングを開始した後、記述されたプロセスにマージされたすべてのオブジェクトが決して割り当て解除されないことを発見しました.
メインスレッドですべてを行うと、動作します-UITableViewをスクロールすると、期待どおりに割り当てが解除されます。
回避策を見つけたので、電話しています:
マージが完了したら:
しかし、なぜそれをしなければならないのか、それが他の何かを壊すのかどうかはわかりません. バックグラウンドでデータを更新するより良い方法があるかもしれませんが、私は完全に間違った方向に進んでいます。
ios - Objective-C 自分のオブジェクトを参照しているオブジェクトを確認する方法 (保持サイクル)
コードの特定の部分で、オブジェクトの割り当てが解除されることを期待していますが、そうではありません。
そのオブジェクトが与えられた場合、どのオブジェクトがそれを参照しているかを確認するにはどうすればよいですか?
また、オブジェクトの参照カウントが上がるたびに知ることは可能ですか? (およびどのオブジェクトによって)
ios - self を参照する別のメソッドを呼び出すブロック内でメソッドを呼び出すと、リテイン サイクルが発生しますか?
doFirst
ここで保持サイクルが発生する可能性はありますか?
ios - UINavigationController と UIViewControllers の間に保持ループがない理由
状況: UIViewController がプッシュされた UINavigationController があります。
1.UIViewController は UINavigationController を強く参照しています
2.UINavigationController はビュー コントローラを NSArray に格納します
UINavigationController は、この NSArray への強力な参照を持つ必要があります (または、割り当てが解除されます)。
3.NSArray には、含まれているビュー コントローラーへの強力な参照があります。
更新: 次のコードのどこかを想像してみましょう:
私の質問は、なぜここに保持ループがないのですか?