swift - stopped - Deinit nunca llamó
docker-compose declare volume (8)
¿Alguna de tus clases, o las propiedades que contienen hacen una referencia al controlador de vista que has aparecido?
Si su UIViewController ha creado una instancia de un objeto, que a su vez hace una referencia ''fuerte'' a ese controlador de vista (por ejemplo, una referencia que no está explícitamente declarada como ''débil'' o ''sin propietario''), y su controlador de vista guarda una referencia fuerte ese objeto también, ninguno será desasignado. Eso se llama un fuerte ciclo de referencia, documentado aquí (una lectura obligada para los desarrolladores Swift serios):
El lenguaje de programación Swift (Swift 3.0.1): recuento automático de referencias
Los cierres son un caso más insidioso donde puede meterse en problemas.
Una cosa que puede intentar como experimento es presionar el controlador y abrirlo antes de hacer algo en viewDidLoad o en la inicialización, y ver si se está llamando al método deinit. Si es así, entonces usted debería poder descubrir incrementalmente lo que está haciendo que está conduciendo al síntoma que está viendo.
Otra cosa que puede frustrar el diagnóstico (como han señalado otras respuestas), que aprendí de la manera difícil, es que el punto de corte del depurador no se tomará para deinit () si el método deininit no contiene sentencias ejecutables, porque el sistema operativo o compilador optimiza la invocación de deinit si está vacía, así que al menos ponga una declaración de impresión allí si desea verificar que se llame a deinit ().
Estoy creando un objeto ViewController empujándolo a un controlador de navegación. Cuando el objeto se extrae de la pila, no se está liberando y no se está llamando a Deinit. ¿Cuál puede ser el motivo para eso?
Aquí está el código que empuja:
self.navigationController?.pushViewController(CustomViewController(), animated: true)
Y aquí está el código que aparece:
self.navigationController?.popViewControllerAnimated(true)
Estaba usando este tutorial TabBar personalizado con una secuencia personalizada en la página dada. El problema de memoria se debió a una subvista que tenía una fuerte referencia al controlador de vista padre.
class WBMNewsFeedV: UIView
{
var parentVC:WBMHomeTabVC!
}
WBMNewsFeedV - subclase
parentVC: WBMHomeTabVC - clase primaria ViewController
Lo cambié a:
class WBMNewsFeedV: UIView
{
weak var parentVC:WBMHomeTabVC!
}
Entonces, la referencia fuerte estaba anidada dentro de una subvista y no visible al principio. Espero que esto ayude a cualquiera. Después de que el cambio de deinit siempre fue llamado en
WBMHomeTabVC
Me encontré con un problema similar. Mi problema parece haber sido causado por una fuerte referencia a un control que tenía una asignación de delegado no especificada como ''débil'' con un protocolo de tipo de clase.
Me enfrenté al mismo problema. En mi caso, un ciclo interminable de UIView.animateWithDuration ... mantiene el ViewController en la memoria y bloquea la llamada de deinit. Si utilizas algo como esto, primero debes detenerlo antes de que elimines ViewController. Espero que ayude.
Tenía un temporizador en mi controlador de vista, ejecutando cada minuto para actualizar una etiqueta. Puse una llamada en deinit para invalidar el temporizador, que estoy bastante seguro de que es lo que siempre he hecho en Objective-C (en dealloc) y funcionó. Pero parece un poco diferente en Swift, así que moví el código de creación de tiempo / invalidación para verWillAppear / viewWillDisappear (lo cual tiene más sentido en realidad) y todo parece estar bien ahora.
Tuve el mismo problema cuando el NotificationCenter guardaba una fuerte referencia a la vista presentada controlada y, por lo tanto, nunca se publicó. Así que tuve que agregar [yo débil] al bloque de esta manera:
(en el viewDidLoad)
NotificationCenter.default.addObserver(forName: .showFoo, object: nil,
queue: OperationQueue.main) { [weak self] (notification) in
if let foo = notification.userInfo?["foo"] as? Foo {
self?.afooButton!.setImage(UIImage(named: "foo"), for: .normal)
}
}
Tuve un problema similar. deinit
método de deinit
vacío a mi clase y agregué un punto de interrupción:
deinit {
}
Como resultado, nunca se llama.
Tan pronto como agregué un código al cuerpo, comenzó a funcionar como se esperaba:
deinit {
print("deinit called")
}
Así que asegúrese de que su método de deinit
no esté vacío.
PD. Estoy usando Swift 2, Xcode 7.1
agregue un código de línea de in deinit. Si pones un punto de interrupción en Empty deinit, el compilador no te detendrá allí, pon esto:
deinit {
print("any thing")
}
Funcionará ;)