Hvorfor er [weak self] eller [unowned self] ikke nødvendig i Operation Queue?
On oktober 5, 2021 by adminDette 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.
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
Legg igjen en kommentar