2009-02-26 6 views
7

J'ai beaucoup parlé de typage dynamique dans Objective-C. Mais je n'ai pas vu d'exemples de ce que je pense qu'il est censé être. Disons que j'ai une fonction générique qui est censée jongler avec deux objets (l'un est alloué et l'autre est libéré) et l'objet appelant le rattache lui-même à l'objet nouvellement alloué. Les deux sont hérités de class0Comment allouer un objet typé dynamique

S'il vous plaît n'hésitez pas à interpréter ce que vous voulez si vous pensez qu'il va expliquer quelque chose !!

Si la classe est prise lors de l'exécution, comment je traite avec la liste des arguments (? Est un espace réservé pour l'instant) Comment puis-je alloc un objet qui est classe n'est pas défini avant l'exécution?

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

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

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

} 

Répondre

19

je ne sais pas ce que le code que vous avez il essaie de le faire, ce n'est pas syntaxiquement valide, et la manipulation de vues n'a rien à voir avec vos questions. Quoi qu'il en soit, si vous ne connaissez pas vraiment le type, vous utilisez généralement "id" qui est de type cast à un "void *" pour codegen. Il a la propriété spéciale qu'il est supposé recevoir un message, de sorte qu'il ne déclenche pas d'avertissements du compilateur pour les messages inconnus. Afin d'instancier une classe, il vous suffit de maintenir l'objet "Class" pour cela. En Objective C, toutes les instances d'une classe se réfèrent à un objet Class (le pointeur isa dans le runtime hérité), qui répond également aux méthodes. Donc, en d'autres termes, dans le code suivant:

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

NSArray est en fait un objet. Donc, cela va générer des résultats de code équivalent:

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

ou même

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

qui utilise la fonction NSClassFromString qui entre dans le moteur d'exécution et trouve une classe avec le nom que vous passez

Tous. les objets renvoient leur classe s'ils utilisent la classe getter, donc pour instancier un objet qui est la même classe qu'un objet existant comme ceci:

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

Ha, oui je sais que ce n'était pas correct sur le plan syntaxique et que les vues y sont jetées. J'aurais dû préciser que l'exemple était le code psuedo bastardized. Et pourtant vous avez réussi à répondre à ma question. Merci –

+0

Vous devez écrire cela comme "Class myClass = [NSArray class]". Vous ne pouvez utiliser le nom que lorsqu'il est la cible d'un message. –

+0

Voilà ce que je reçois pour faire cela tard dans la nuit dans un champ de texte web ;-) –

0

C'est ce que j'ai maintenant

- (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];  
} 

Je ne peux pas vérifier encore parce que j'ai un problème de liaison ... J'ai ajouté ce func à mon contrôleur racine, mais pour une raison quelconque, je reçois un avertissement que la fonction est implicitement déclaré. Et la construction échoue parce que l'appel de fonction n'est jamais lié à quoi que ce soit.

+0

hmm func nom est backward swap v1 avec v2 –

Questions connexes