2012-02-27 13 views

Respuesta

0

Para decirlo de manera muy simple, NSInvocation es menos potente que los bloques. Simplemente encapsula una llamada a un solo método en un solo objeto, mientras que los bloques pueden envolver muchas líneas de código arbitrario. Incluso su bloque de cuadratura muy simple es imposible de representar utilizando una invocación sin soporte de una clase existente que haría la cuadratura misma.

3

Un NSInvocation es un mensaje (usando un selector) a un objeto, con parámetros opcionales, que se pueden ejecutar más tarde (o ahora) y fuera del contexto actual (por supuesto, lo que copia vs retener o referencia si Muévelo). NSInvocation tiene la ventaja de que puede copiar/consultar de forma selectiva exactamente lo que necesita.

El bloque es una definición local de la función secreta, que es capaz de capturar porciones del contexto del subproceso actual, o por completo. También es un poco más fácil de configurar que un NSInvocation porque captura, copia y retiene automáticamente el contexto local del subproceso (o el alcance). Los bloques pueden aumentar su tamaño binario ligeramente, similar a las funciones. Si se eliminan del contexto local (por ejemplo, al copiar un bloque), los bloques pueden requerir bastante más tiempo de CPU y memoria, en comparación con NSInvocation.

3

NSInvocation es un objeto que encapsula una llamada mensaje: el objeto de destino, el selector, los argumentos y el valor de retorno. Un bloque es un objeto que encapsula una sección de código y cierta información sobre el estado del programa que conduce a esa sección: específicamente registra las variables en la pila de llamadas hasta la creación del bloque.

Ambos claramente se puede utilizar como devoluciones de llamada: puede utilizar una invocación a enviar un mensaje a un objeto, o puede ejecutar código de un bloque al igual que una función. Lo que es diferente de ellos es la forma en que transportarías el estado en cada caso. Con una invocación, o necesita el objeto de destino o uno de los parámetros para representar el contexto en el que aparece el mensaje. Con un bloque, este contexto se captura automáticamente del estado cuando se creó el bloque.

+0

bloque es una función? ¿u objeto? Como dice @Justin: El bloque es una definición de función local secreta – holsety

+0

Ambas son :). Un bloque es una función anónima, junto con una copia de la pila en el momento en que creaste el bloque (más o menos). También es un objeto Objective-C, por lo que puede crear copias del bloque y posteriormente liberar esas copias. Cuando ejecutas el bloque, en realidad estás llamando a su función; aunque el tiempo de ejecución también configura la pila del bloque antes de ingresar a la función. –

Cuestiones relacionadas