Sobes.tech
Junior — Middle

Como é que a gestão de objetos dentro de um array ocorre no contexto de capturá-los numa outra estrutura ou função lambda?

sobes.tech IA

Resposta da IA

No iOS, ao trabalhar com arrays de objetos e capturá-los em outra estrutura ou função lambda (por exemplo, um encerramento), é importante compreender a gestão de memória e a propriedade dos objetos.

  • Se os objetos no array são classes (tipos de referência), ao capturá-los em um encerramento, captura-se uma referência ao objeto. Isto não copia o objeto, mas mantém a referência, o que pode levar a referências cíclicas se o encerramento mantém uma referência ao objeto e vice-versa.
  • Para evitar fugas de memória, usam-se referências fracas (weak) ou não proprietárias (unowned) dentro de encerramentos.

Exemplo:

class MyObject {
    var value: Int
    init(value: Int) { self.value = value }
}

let array = [MyObject(value: 1), MyObject(value: 2)]

let closure = { [weak array] in
    guard let array = array else { return }
    for obj in array {
        print(obj.value)
    }
}

closure()

Se os objetos são estruturas (tipos de valor), ao capturá-los, ocorre uma cópia dos valores.

Assim, a gestão de objetos ao capturá-los depende do tipo (classe ou estrutura) e de como eles são capturados na função lambda.