2012-02-20 18 views
13

Tengo dificultades para entender cuál es la diferencia entre el encuadernado dinámico Vs el tipado dinámico en el Objetivo C. ¿Alguien puede explicar esto?¿Cuál es la diferencia entre el encuadernado dinámico Vs el tipado dinámico en el Objetivo C

+0

posible duplicado de [Objective-C utiliza el enlace dinámico, pero ¿cómo?] (Http://stackoverflow.com/questions/1697093/objective-c-uses-dynamic-binding-but -how) –

+1

@Richard - No estoy de acuerdo. El OP pregunta sobre la diferencia entre el enlace dinámico y el tipado dinámico. La pregunta a la que hace referencia no aborda la tipificación dinámica en absoluto. – jlehr

Respuesta

27

Dynamic typing en Objective-C significa que la clase de un objeto de tipo id es desconocida en tiempo de compilación, y en su lugar se descubre en tiempo de ejecución cuando se envía un mensaje al objeto. Por ejemplo, en el siguiente código, la clase de foo no se conoce hasta que intentemos enviar el mensaje componentsSeparatedByString:.

id foo = @"One Two Three"; 
NSArray *a = [foo componentsSeparatedByString:@" "]; 

Si en lugar de utilizar el tipo de datos id que habíamos hecho lo siguiente ...

NSString *foo = @"One Two Three"; 

... entonces estaríamos usando tipos estáticos en lugar de tipado dinámico.

Dynamic binding significa que el compilador no sabe qué método de implementación se seleccionará; en su lugar, la implementación del método se busca en el tiempo de ejecución cuando se envía el mensaje. Básicamente nos ayuda con Polymorphism. Así

[foo description] 

resultados en la invocación de una implementación del método diferente si, por ejemplo, foo es una instancia de NSArray en lugar de una instancia de NSString.

6

con tipado dinámico puede tener una variable del tipo id que puede almacenar cualquier tipo de objeto. con enlace dinámico puede hacer esto: id obj; [obj doWhatever]; y mientras obj sea de un tipo que implemente -(void)doWhatever, funcionará.

2

de Apple Documentación

dinámico escribir

Una variable se escribe dinámicamente cuando el tipo de objeto al que apunta no está marcada en tiempo de compilación. Objective-C usa el tipo de datos de id para representar una variable que es un objeto sin especificar qué tipo de objeto es. Esto se conoce como tipado dinámico.

El tipado dinámico contrasta con el tipado estático, en el que el sistema identifica explícitamente la clase a la que pertenece un objeto en tiempo de compilación. La comprobación del tipo estático en tiempo de compilación puede garantizar una integridad de datos más estricta, pero a cambio de esa integridad, el tipado dinámico le da a su programa una mayor flexibilidad. Y a través de la introspección de objetos (por ejemplo, preguntarle a un objeto anónimo de tipado dinámico cuál es su clase), aún se puede verificar el tipo de un objeto en tiempo de ejecución y así validar su idoneidad para una operación en particular.

El siguiente ejemplo ilustra tipado dinámico utilizando una colección heterogénea de objetos:

NSArray *anArray = [NSArray arrayWithObjects:@"A string", [NSDecimalNumber zero], [NSDate date], nil]; 
NSInteger index; 
for (index = 0; index < 3; index++) { 
    id anObject = [anArray objectAtIndex:index]; 
    NSLog(@"Object at index %d is %@", index, [anObject description]); 
} 

El objeto apuntado por la variable en tiempo de ejecución debe ser capaz de responder a cualquier mensajes que envía a la misma; de lo contrario, su programa arroja una excepción. La implementación real del método invocado se determina utilizando enlace dinámico.

Enlace dinámico

Enlace dinámico es determinar el método a invocar en tiempo de ejecución en lugar de en tiempo de compilación. La vinculación dinámica también se conoce como vinculación tardía. En Objective-C, todos los métodos se resuelven dinámicamente en tiempo de ejecución. El código exacto ejecutado está determinado por el nombre del método (el selector) y el objeto receptor.

El enlace dinámico permite el polimorfismo. Por ejemplo, considere una colección de objetos que incluye Dog, Athlete y ComputerSimulation. Cada objeto tiene su propia implementación de un método de ejecución. En el siguiente fragmento de código, el código real que debe ejecutarse mediante la expresión [anObject run] se determina en tiempo de ejecución. El sistema de tiempo de ejecución usa el selector para ejecutar el método para identificar el método apropiado en cualquier clase de objeto que resulte ser.

NSArray *anArray = [NSArray arrayWithObjects:aDog, anAthlete, aComputerSimulation, nil]; 
id anObject = [anArray objectAtIndex:(random()/pow(2, 31)*3)]; 
[anObject run]; 
0

Si está familiarizado con Javascript, tipado dinámico en C objetiva es más o menos similar a lo que 'var' es en Javascript, en el que el tipo real de esta variable será resuelto en tiempo de ejecución y una vez que está asignado Se puede reutilizar y volver a escribir tantas veces como desee, lo que hace que sea arriesgado utilizarlo si no conoce el tipo de objeto que se está reteniendo en el momento de la ejecución lo más posible a través de excepciones de tiempo de ejecución del "selector no reconocido". . En Objective-C, todos los objetos son de tipo id y, por lo tanto, se puede usar una variable de tipo id para el tipado dinámico.

El enlace dinámico en objetos es el comportamiento 'polimórfico' en el que se llama al método correcto en función del tipo de objeto al que se llama en tiempo de ejecución.

Yo espero que ayude

Cuestiones relacionadas