Skip to content

Archives

  • Março 2022
  • Fevereiro 2022
  • Janeiro 2022
  • Dezembro 2021
  • Novembro 2021
  • Outubro 2021
  • Setembro 2021
  • Agosto 2021
  • Julho 2021
  • Junho 2021

Categories

  • Sem categorias
UpBeetEverything everywhere
Articles

por que [weak self] ou [unowned self] não é necessário na fila de operação?

On Outubro 5, 2021 by admin

esta é 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.

Deixe uma resposta Cancelar resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

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

Arquivo

  • Março 2022
  • Fevereiro 2022
  • Janeiro 2022
  • Dezembro 2021
  • Novembro 2021
  • Outubro 2021
  • Setembro 2021
  • Agosto 2021
  • Julho 2021
  • Junho 2021

Meta

  • Iniciar sessão
  • Feed de entradas
  • Feed de comentários
  • WordPress.org
  • Deutsch
  • Nederlands
  • Svenska
  • Norsk
  • Dansk
  • Español
  • Français
  • Português
  • Italiano
  • Română
  • Polski
  • Čeština
  • Magyar
  • Suomi
  • 日本語
  • 한국어

Copyright UpBeet 2022 | Theme by ThemeinProgress | Proudly powered by WordPress