Skip to content

Archives

  • mars 2022
  • februar 2022
  • januar 2022
  • desember 2021
  • november 2021
  • oktober 2021
  • september 2021
  • august 2021
  • juli 2021
  • juni 2021

Categories

  • Ingen kategorier
UpBeetEverything everywhere
Articles

Hvorfor er [weak self] eller [unowned self] ikke nødvendig i Operation Queue?

On oktober 5, 2021 by admin

Dette Er En Swifts fangstliste og hvordan den kan brukes til å unngå å beholde syklus, jeg kan ikke bidra til å merke noe forvirrende Om OperationQueue: det trenger ikke enten «eller» for å forhindre minnelekkasje.

 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. } }

jeg ser ikke hvorfor å legge til en operasjon ikke ville føre til en beholdningssyklus: ‘SomeManager’ eier sterkt ‘køen’, som i sin tur eier sterkt de ekstra lukningene. Hver ekstra lukking refererer sterkt tilbake til ‘SomeManager’. Dette bor teoretisk skape en beholde syklus som forer til minnelekkasje. Likevel Viser Instrumentene at alt er helt greit.

Ingen Lekkasje Bilde

Hvorfor er dette tilfelle? I noen andre multi-threaded, blokkbaserte Apier, som` DispatchSource’, synes du å trenge fangstlisten. Se Apples eksempelkode ‘ShapeEdit for eksempel i’ ThumbnailCache.rask`:

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

Men i samme kodefil trenger `OperationQueue` ikke fangstlisten, til tross for å ha samme semantikk: du overlater en lukning med henvisning til ‘selv` som skal utføres asynkront:

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

jeg har lest Om Swifts fangstliste nevnt ovenfor, samt relaterte SO-svar (nevnt i det opprinnelige innlegget PÅ SO), men jeg vet fortsatt ikke hvorfor ` eller ` ikke er nødvendig i «OperationQueue» API mens de er I «Dispatch» API. Jeg er heller ikke sikker på hvordan det ikke finnes lekkasjer i` OperationQueue ‘ – saken.

eventuelle avklaringer vil bli mye verdsatt.

Legg igjen en kommentar Avbryt svar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

Siste innlegg

  • Tumble Finishing Process
  • Ultralette Fluefiske
  • Petrologi
  • Overgang fra Flaske Til Kopp
  • DotLocal.org
  • » speed bump», den ideelle posisjonen for Å nå G-punktet
  • Strepsiptera
  • Universitetsbiblioteker
  • TOP2A Forsterkning Og Overuttrykk I Hepatocellulært Karsinomvev
  • Hvorfor Du Bør Si «Takk» I Stedet For «Beklager» Når Du Gjør Noe Galt

Arkiv

  • mars 2022
  • februar 2022
  • januar 2022
  • desember 2021
  • november 2021
  • oktober 2021
  • september 2021
  • august 2021
  • juli 2021
  • juni 2021

Meta

  • Logg inn
  • Innleggsstrøm
  • Kommentarstrøm
  • WordPress.org
  • 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