¿Es necesario usar en cierres de UIView.animateWithDuration (…)?

UIView.animateWithDuration(1, animations: { [unowned self] in self.box.center = self.boxTopRightPosition }, completion: { [unowned self] completed in self.box.hidden = true }) 

¿Es necesario evitar la pérdida de memory?

No, no es necesario en este caso. animations y la completion no se retienen por self por lo que no hay riesgo de un fuerte ciclo de retención.

Bueno, "necesario" no es lo mismo que "recomendado". Si su pregunta es si es necesario, entonces la respuesta de @Kirsteins está bien; sin embargo, imagine la situación en la que desea animar algo en su controller de vista después de algún trabajo, pero su controller de vista se ha liberado (porque ya no está en la jerarquía de la vista o por cualquier otro motivo). En este caso, si no usa [weak self] , su controller de vista no se liberará hasta que finalice la animation porque lo está reteniendo en el bloque de animation, pero tiene sentido mantenerlo retenido hasta que se anima algo que Ya no está en la vista?

Entonces, en pocas palabras, no necesitas usar una reference weak a ti mismo al animar UIKit, sin embargo, no necesitas mantener tu vista retenida si se lanza, porque una animation sin vista no tiene sentido, por lo que usar weak es una buena opción

@Plabo, como dijo @Kirsteins, las animaciones y la finalización no se retienen por sí mismas, por lo que incluso si inicia una animation y, por alguna razón, se ha liberado su controller de vista, se desasignará instantáneamente. Por lo tanto, no necesita 'auto' capturado. Considere el siguiente ejemplo tonto:

 class ViewController: UIViewController { @IBOutlet weak var button : UIButton! override func viewDidLoad() { super.viewDidLoad() print("viewDidLoad ViewController") } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIView.animate(withDuration: 20, animations: { self.button.frame = CGRect(x: 0, y: 300, width: 30, height: 30) }) { finished in self.button.frame = CGRect(x: 0, y: 100, width: 30, height: 30) } } deinit { print("deinit ViewController") } } 

Tan pronto como sea desasignado, se llamará al desinicializador y la finalización nunca se ejecutará.