Skip to content

Archives

  • 2022 március
  • 2022 február
  • 2022 január
  • 2021 december
  • 2021 november
  • 2021 október
  • 2021 szeptember
  • 2021 augusztus
  • 2021 július
  • 2021 június

Categories

  • Nincs kategória
UpBeetEverything everywhere
Articles

miért nincs szükség a [weak self] vagy [unowned self] Műveletsorra?

On október 5, 2021 by admin

ez egy Swift rögzítési listája, és hogyan lehet használni a ciklus megtartásának elkerülésére, nem tudok nem észrevenni valami rejtélyes dolgot az OperationQueue-ban: nem kell ` vagy ` a memóriaszivárgás megakadályozásához.

 class SomeManager { let queue = OperationQueue() let cache: NSCache = { () -> NSCache<AnyObject, AnyObject> in let cache = NSCache<AnyObject, AnyObject>() cache.name = "huaTham.TestOperationQueueRetainCycle.someManager.cache" cache.countLimit = 16 return cache }() func addTask(a: Int) { queue.addOperation { // " in" not needed? self.cache.setObject(a as AnyObject, forKey: a as AnyObject) print("hello \(a)") } } }

 class ViewController: UIViewController { var someM: SomeManager? = SomeManager() override func viewDidLoad() { super.viewDidLoad() someM?.addTask(a: 1) someM?.addTask(a: 2) } // This connects to a button. @IBAction func invalidate() { someM = nil // Perfectly fine here. No leak. } }

nem értem, hogy egy művelet hozzáadása miért nem okozna megtartási ciklust: A ‘SomeManager’ erősen birtokolja a` várólistát’, amely viszont erősen birtokolja a hozzáadott bezárásokat. Minden hozzáadott zárás erősen utal vissza a `SomeManager` – re. Ennek elméletileg létre kell hoznia egy megtartási ciklust, amely memóriaszivárgáshoz vezet. Az eszközök azonban azt mutatják, hogy minden tökéletesen rendben van.

nincs szivárgás kép

miért van ez a helyzet? Néhány más többszálú, blokk alapú API-ban, mint például a ‘DispatchSource’, úgy tűnik, hogy szüksége van a rögzítési listára. Lásd például az Apple `ShapeEdit ‘mintakódját a’ ThumbnailCache részben.swift:

 fileprivate var flushSource: DispatchSource ... flushSource.setEventHandler { in // Here guard let strongSelf = self else { return } strongSelf.delegate?.thumbnailCache(strongSelf, didLoadThumbnailsForURLs: strongSelf.URLsNeedingReload) strongSelf.URLsNeedingReload.removeAll() }

de ugyanabban a kódfájlban az ‘OperationQueue’ – nak nincs szüksége a rögzítési listára, annak ellenére, hogy ugyanaz a szemantikája: átadja a bezárást az `self` hivatkozással, amelyet aszinkron módon kell végrehajtani:

 fileprivate let workerQueue: OperationQueue { ... } ... self.workerQueue.addOperation { if let thumbnail = self.loadThumbnailFromDiskForURL(URL) { ... self.cache.setObject(scaledThumbnail!, forKey: documentIdentifier as AnyObject) } }

olvastam a Swift fent említett rögzítési listájáról, valamint a kapcsolódó SO válaszokról (amelyeket az SO eredeti bejegyzésében említettünk), de még mindig nem tudom, miért nincs szükség ` vagy ` – ra az “OperationQueue” API-ban, miközben a “Dispatch” API-ban vannak. Abban sem vagyok biztos, hogy az `OperationQueue` ügyben nem találhatók szivárgások.

minden pontosítást nagyra értékelnénk.

Vélemény, hozzászólás? Kilépés a válaszból

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Legutóbbi bejegyzések

  • Szárítógépek kikészítési folyamata
  • ultrakönnyű Legyező Horgászat
  • Petrológia
  • Áttérés palackról csészére
  • DotLocal.org
  • a” speed bump”, az ideális helyzet a G pont eléréséhez
  • Strepsiptera
  • egyetemi könyvtárak
  • TOP2A amplifikáció és túlzott expresszió a hepatocellularis Carcinoma szöveteiben
  • Miért kell “köszönöm” – t mondanod a “Sajnálom” helyett, amikor valamit rosszul csinálsz?

Archívum

  • 2022 március
  • 2022 február
  • 2022 január
  • 2021 december
  • 2021 november
  • 2021 október
  • 2021 szeptember
  • 2021 augusztus
  • 2021 július
  • 2021 június

Meta

  • Bejelentkezés
  • Bejegyzések hírcsatorna
  • Hozzászólások hírcsatorna
  • WordPress Magyarország
  • Deutsch
  • Nederlands
  • Svenska
  • Norsk
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
  • 한국어

Copyright UpBeet 2022 | Theme by ThemeinProgress | Proudly powered by WordPress