Hoppa till innehåll

Archives

  • mars 2022
  • februari 2022
  • januari 2022
  • december 2021
  • november 2021
  • oktober 2021
  • september 2021
  • augusti 2021
  • juli 2021
  • juni 2021

Categories

  • Inga kategorier
UpBeetEverything everywhere
Articles

varför behövs inte [svagt själv] eller [oägt själv] i Operationskö?

On oktober 5, 2021 by admin

Detta är en Swifts fångstlista och hur den kan användas för att undvika att behålla cykeln, jag kan inte låta bli att märka något förbryllande om OperationQueue: det behöver inte heller ` eller ` för att förhindra minnesläckage.

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

jag kan inte se varför att lägga till en operation inte skulle orsaka en behållningscykel: ` SomeManager `äger starkt ’kön’, som i sin tur starkt äger de tillagda stängningarna. Varje tillsatt stängning hänvisar starkt tillbaka till ’SomeManager’. Detta bör teoretiskt skapa en behållningscykel som leder till minnesläckage. Ändå visar instrument att allt är helt bra.

ingen läcka bild

Varför är detta fallet? I vissa andra flertrådade, blockbaserade API: er, som `DispatchSource`, verkar du behöva fångstlistan. Se Apples exempelkod ’ShapeEdit till exempel i’ ThumbnailCache.Snabb`:

 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 samma kodfil behöver `OperationQueue` inte fångstlistan, trots att du har samma semantik: du överlämnar en stängning med hänvisning till ’själv` för att utföras asynkront:

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

jag har läst om Swifts fångstlista som nämns ovan, liksom relaterade SO-svar (nämns i det ursprungliga inlägget på SO), men jag vet fortfarande inte varför ` eller ` inte behövs i ”OperationQueue” API medan de är i ”Dispatch” API. Jag är inte heller säker på hur inga läckor finns i `OperationQueue` fall.

eventuella förtydliganden skulle vara mycket uppskattade.

Lämna ett svar Avbryt svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Senaste inläggen

  • Tumble Finishing Process
  • ultralätt Flugfiske
  • Petrologi
  • Övergång från flaska till kopp
  • DotLocal.org
  • ” speed bump”, den perfekta positionen för att nå G-punkten
  • Strepsiptera
  • universitetsbibliotek
  • TOP2A-förstärkning och överuttryck i hepatocellulära Karcinomvävnader
  • Varför ska du säga ”tack” istället för ”ledsen” när du gör något fel

Arkiv

  • mars 2022
  • februari 2022
  • januari 2022
  • december 2021
  • november 2021
  • oktober 2021
  • september 2021
  • augusti 2021
  • juli 2021
  • juni 2021

Meta

  • Logga in
  • Flöde för inlägg
  • Flöde för kommentarer
  • WordPress.org
  • Deutsch
  • Nederlands
  • Svenska
  • Norsk
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
  • 한국어

Upphovsrätt UpBeet 2022 | Tema av ThemeinProgress | Drivs med WordPress