feat: use NSHashTable to avoid memory leak

This commit is contained in:
dscyrescotti
2024-06-10 23:54:14 +07:00
parent d983464402
commit 164fd457a3
2 changed files with 4 additions and 4 deletions
+2 -2
View File
@@ -59,7 +59,7 @@ final class GraphicContext: @unchecked Sendable {
eraserStrokes.remove(eraserStroke) eraserStrokes.remove(eraserStroke)
withPersistence(\.backgroundContext) { [weak eraserStroke] context in withPersistence(\.backgroundContext) { [weak eraserStroke] context in
guard let eraserStroke else { return } guard let eraserStroke else { return }
for penStroke in eraserStroke.penStrokes { for penStroke in eraserStroke.penStrokes.allObjects {
penStroke.eraserStrokes.remove(eraserStroke) penStroke.eraserStrokes.remove(eraserStroke)
if let object = eraserStroke.object { if let object = eraserStroke.object {
penStroke.object?.erasers.remove(object) penStroke.object?.erasers.remove(object)
@@ -94,7 +94,7 @@ final class GraphicContext: @unchecked Sendable {
eraserStrokes.insert(eraserStroke) eraserStrokes.insert(eraserStroke)
withPersistence(\.backgroundContext) { [weak eraserStroke] context in withPersistence(\.backgroundContext) { [weak eraserStroke] context in
guard let eraserStroke else { return } guard let eraserStroke else { return }
for penStroke in eraserStroke.penStrokes { for penStroke in eraserStroke.penStrokes.allObjects {
penStroke.eraserStrokes.insert(eraserStroke) penStroke.eraserStrokes.insert(eraserStroke)
if let object = eraserStroke.object { if let object = eraserStroke.object {
penStroke.object?.erasers.add(object) penStroke.object?.erasers.add(object)
@@ -34,7 +34,7 @@ final class EraserStroke: Stroke, @unchecked Sendable {
weak var graphicContext: GraphicContext? weak var graphicContext: GraphicContext?
var finishesSaving: Bool = false var finishesSaving: Bool = false
var penStrokes: Set<PenStroke> = [] var penStrokes: NSHashTable<PenStroke> = .weakObjects()
init( init(
bounds: [CGFloat], bounds: [CGFloat],
@@ -112,7 +112,7 @@ final class EraserStroke: Stroke, @unchecked Sendable {
for stroke in graphicContext.tree.search(box: _quad.quadBox) { for stroke in graphicContext.tree.search(box: _quad.quadBox) {
if let _penStroke = stroke.stroke(as: PenStroke.self), !_penStroke.eraserStrokes.contains(self) { if let _penStroke = stroke.stroke(as: PenStroke.self), !_penStroke.eraserStrokes.contains(self) {
_penStroke.eraserStrokes.insert(self) _penStroke.eraserStrokes.insert(self)
penStrokes.insert(_penStroke) penStrokes.add(_penStroke)
if let penStroke = _penStroke.object { if let penStroke = _penStroke.object {
penStroke.erasers.add(eraser) penStroke.erasers.add(eraser)
eraser.strokes.add(penStroke) eraser.strokes.add(penStroke)