varför behövs inte [svagt själv] eller [oägt själv] i Operationskö?
On oktober 5, 2021 by adminDetta ä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.
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
Lämna ett svar