Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

214
Vistas
¿Cuáles son los efectos de nunca llamar al controlador de finalización de una función?

¿Qué sucede si nunca llama al controlador de finalización? ¿Hay algún efecto secundario? Supongo que puede haber una pérdida de memoria, pero no puedo encontrar ninguna documentación.

 func completeMe(completionHandler: @escaping (String?) -> Void) { return }
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Fundamentalmente, no hay nada especial en un "controlador de finalización". Es solo una función.

Si tienes una función:

 func f() { print("Hello, world") }

y no lo llamas, ¿qué pasa entonces? Bueno, no pasa nada .

Ahora, ¿cuáles son las implicaciones de eso? Como mencionó rmaddy, si una función tiene una finalización, las personas que llaman ciertamente esperan la invocación de esa finalización. Es inusual, en el mejor de los casos, que una función tome una finalización y que a la persona que llama no le importe si la finalización se ejecuta alguna vez.*

Imagine que la función es llamada por un controlador de vista que inicia un indicador de actividad antes de llamar, y luego, al finalizar, detiene el indicador. Si nunca se llama a la finalización, entonces el indicador nunca deja de girar.

Fundamentalmente, eso es todo. Si no se llama a la finalización, su código no se ejecuta . Los efectos de eso dependen completamente de lo que sucede en el código en y alrededor de la finalización.


De acuerdo, mencionaste la memoria... Muchas veces, un controlador de finalización será una función anónima. En ese caso, hay un objeto creado. Pero está sujeto a las mismas reglas de administración de memoria que cualquier otro objeto. No hay fuga solo porque no se llama. Si completeMe se ve así:

 func completeMe(_ completionHandler: (String) -> Void) { completionHandler("Hello, world") }

y lo llamas así:

 completeMe({ self.detailLabel.text = $0 })

Entonces, el objeto creado para la función anónima no pasa cuando completeMe regresa. Si almacena la función anónima:

 func completeMe(_ completionHandler: @escaping (String) -> Void) { self.handler = completionHandler // Do other things }

Entonces sucede lo mismo que con cualquier otro objeto: la función anónima vive hasta que esa propiedad se establece en otro valor (dado que nada más tiene una referencia a ella) .

Y si pasas una función con nombre,

 func takeAString(_ s: String) { print(s) } completeMe(takeAString)

el tiempo de vida de takeAString ya es el tiempo de vida del programa; no hay implicaciones de gestión de memoria aquí.

Si pasa un método de instancia, la administración de la memoria es la misma que si hubiera pasado la instancia misma.


* En general, si es posible que falle, a) tendrías una segunda finalización "fallida" o b) la finalización indicaría falla a través de su argumento.

over 4 years ago · Santiago Trujillo Denunciar

0

Dado que el parámetro se llama completionHandler , la persona que llama asumirá que se ejecutará, pase lo que pase.

Entonces, para responder a su pregunta, no habrá efectos secundarios inherentes, pero podría considerarse una mala práctica.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda