por que [weak self] ou [unowned self] não é necessário na fila de operação?
On Outubro 5, 2021 by adminesta é a lista de captura de um Swift e como ele pode ser usado para evitar reter o ciclo, não posso deixar de notar algo intrigante sobre OperationQueue: não precisa nem ` ou ` para evitar vazamento de memória.
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. } }
eu não vejo por que a adição de uma operação não iria causar uma reter ciclo: ‘SomeManager’ possui fortemente a ‘fila’, que por sua vez possui fortemente os fechamentos adicionados. Cada fechamento adicionado refere-se fortemente a `SomeManager`. Isso deve teoricamente criar um ciclo de retenção levando ao vazamento de memória. No entanto, os instrumentos mostram que tudo está perfeitamente bem.
Nenhuma Imagem de Vazamento
Por que é assim? Em algumas outras APIs multi-threaded, baseadas em blocos, como `DispatchSource`, você parece precisar da lista de captura. Veja o código de exemplo da Apple `ShapeEdit por exemplo, em ‘ ThumbnailCache.rapido`:
fileprivate var flushSource: DispatchSource ... flushSource.setEventHandler { in // Here guard let strongSelf = self else { return } strongSelf.delegate?.thumbnailCache(strongSelf, didLoadThumbnailsForURLs: strongSelf.URLsNeedingReload) strongSelf.URLsNeedingReload.removeAll() }
Mas no mesmo arquivo de código, `OperationQueue` não precisa de captura lista, apesar de ter a mesma semântica: a mão sobre um fechamento com referência a `auto` para ser executado de forma assíncrona:
fileprivate let workerQueue: OperationQueue { ... } ... self.workerQueue.addOperation { if let thumbnail = self.loadThumbnailFromDiskForURL(URL) { ... self.cache.setObject(scaledThumbnail!, forKey: documentIdentifier as AnyObject) } }
eu li sobre Swift captura lista acima mencionados, bem como os relacionados PARA respostas (mencionado no post original sobre ISSO), mas eu ainda não sei porque ` ou ` não são necessários em `OperationQueue` API, enquanto eles estão no `Expedição` API. Também não tenho certeza de como nenhum vazamento é encontrado no caso `OperationQueue`.
Quaisquer esclarecimentos seria muito apreciada.
Artigos recentes
- processo de acabamento de queda
- Pesca Com Mosca Ultraleve
- Petrologia
- A transição da mamadeira para Copa do
- o” Speed bump”, a posição ideal para alcançar o ponto G
- Strepsiptera
- Bibliotecas Universitárias
- amplificação e superexpressão de TOP2A em tecidos de Carcinoma hepatocelular
- Por que Você Deve Dizer “Obrigado” em Vez De “Desculpe” Quando Você faz Algo Errado
- sol na 11ª casa
Deixe uma resposta