miért nincs szükség a [weak self] vagy [unowned self] Műveletsorra?
On október 5, 2021 by adminez 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.
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?
Vélemény, hozzászólás?