2009-02-26 8 views
7

He visto muchas conversaciones sobre tipado dinámico en Object-C. Pero no he visto ningún ejemplo de lo que creo que se supone que es.Cómo asignar un objeto tipeado dinámicamente

digamos que tengo una función genérica que se supone que hace malabares con dos objetos (uno se asigna y el otro se libera) y el objeto llamante se adjunta al objeto recién asignado. Ambos son heredados de la clase 0

¡Por favor, siéntete libre de interpretar esto como quieras si crees que explicará algo!

Si la clase se selecciona en tiempo de ejecución, ¿cómo trato la lista de argumentos (? Es un marcador de posición por ahora) ¿Cómo puedo asignar un objeto cuya clase no está definida hasta el tiempo de ejecución?

-(void) juggle:(?*)objclass1:(?*)objclass2{ 

? temp = [? alloc] init]; 
objclass1 = temp; 
[temp release]; 

[objclass2.view removefromsuperview]; 
[self.handle insertsubview:objclass1.view]; 

} 

Respuesta

19

no tengo idea de lo que el código que tiene allí está tratando de hacer, no es sintácticamente válida, y la manipulación de puntos de vista no tiene nada que ver con sus preguntas. De todos modos, si realmente no conoces el tipo, generalmente utilizas "id", que es un tipo de conversión a "void *" para codegen. Tiene la propiedad especial de que se supone que recibe cualquier mensaje, por lo que no desencadena advertencias del compilador para mensajes desconocidos.

Para ejemplificar una clase, solo necesita tener el objeto "Clase" para ella. En Objective C, todas las instancias de una clase se refieren a un objeto Class (el puntero isa en el tiempo de ejecución heredado), que también responde a los métodos. En otras palabras, en el siguiente código:

NSArray *myObject = [[NSArray alloc] init]; 

NSArray es en realidad un objeto. Así que esto va a generar resultados de código equivalentes:

Class myClass = [NSArray class]; 
NSArray *myObject = [[myClass alloc] init]; 

o incluso

Class myClass = NSClassFromString(@"NSArray"); 
NSArray *myObject = [[myClass alloc] init]; 

que utiliza el NSClassFromString función que camina en el tiempo de ejecución y encuentra una clase con el nombre se pasa en

Todos. Los objetos devuelven su clase si usan el captador de clase, por lo que para crear una instancia de un objeto que sea de la misma clase que un objeto existente como este:

- (void) leakObjectWithSameClassAs:(id)object { 
    [[[object class] alloc] init]; 
} 
+0

Ha, sí, sé que no era sintácticamente correcta y que las vistas se arrojan por doquier. Debería haber dicho que el ejemplo era un código psuedo bastardo. Y sin embargo, lograste responder mi pregunta. Gracias –

+0

Tienes que escribir eso como "Class myClass = [NSArray class]". Solo puede usar el nombre por sí mismo cuando es el objetivo de un mensaje. –

+0

Eso es lo que recibo por hacer esto tarde en la noche en un campo de texto web ;-) –

0

Esto es lo que tengo ahora

- (void)flipfromv1tov2:(UIViewController*)v1:(NSString*)nib1:(UIViewController*)v2{ 

    if(v1 == nil) 
    { 
     UIViewController *newview = [[[v1 class] alloc] initWithNibName:nib1 bundle:nil]; 
     v1 = newview; 
     [newview release]; 
    } 
    [v2.view removeFromSuperview]; 
    [self.view insertSubview:v1.view atIndex:0];  
} 

No puedo verificar todavía porque tengo un problema de enlace ... añadí esta func a mi controlador de raíz, pero por alguna razón me sale un aviso de que la función es implícitamente declarado. Y la compilación falla porque la llamada a la función nunca se ha vinculado a nada

+0

hmm nombre de func es revertir al revés v1 con v2 –

Cuestiones relacionadas