Pregunta

En primer lugar, quiero que quede claro que no estoy hablando acerca de la definición de un protocolo, y que entiendo el concepto de

@protocol someprotocol
- (void)method;
@end

Yo sé que el Obj-C tiempo de ejecución permite la creación de las clases en tiempo de ejecución, así como sus ivars y métodos. También disponible para la creación son SEL-s. Creo que sólo me falta algo, pero ¿alguien sabe cuál es la función de llamada para crear un protocolo en tiempo de ejecución? La razón principal de esto es para conformsToProtocol:. Al trabajo, por lo que acaba de añadir los métodos apropiados en realidad no lo cortó

¿Fue útil?

Solución 2

el siguiente tipo de obras, sino un adecuada forma de hacer esto sería muy apreciada:

Protocol *proto = [Protocol alloc];
object_setInstanceVariable(proto, "protocol_name", &"mySuperDuperProtocol");
void *nada = NULL;
object_setInstanceVariable(proto, "protocol_list", &nada);
object_setInstanceVariable(proto, "class_methods", &nada);

struct objc_method_description_list *methods;
methods = malloc(sizeof(int) + sizeof(struct objc_method_description) * 1);
methods->count = 1;
methods->list[0].name = @selector(foobar:);
methods->list[0].types = "v:@";
object_setInstanceVariable(proto, "instance_methods", &methods);

class_addProtocol([self class], proto);
NSLog(@"%d %s", [self conformsToProtocol:proto], protocol_getName(objc_getProtocol("mySuperDuperProtocol")));

El primer parámetro NSLog es 1, y no es cuando la línea de adición del protocolo a la clase se comenta fuera, es decir, el protocolo es de alguna manera ha registrado en la clase. Por otra parte, no consigue devuelto por objc_getProtocol (el segundo que registra es nulo).

Otros consejos

manera de agregar el protocolo en tiempo de ejecución

Protocol *aProtocol = objc_allocateProtocol("TestingRuntimeDelegate");
AppDelegate *appInstance = (AppDelegate*)[[UIApplication sharedApplication] delegate];
NSLog(@"conformed Protocol ..%d",class_conformsToProtocol([self.delegate class], aProtocol));

protocol_addMethodDescription(aProtocol, @selector(itIsTestDelegate), "test", NO, NO);
objc_registerProtocol(aProtocol);
class_addProtocol([appInstance class], aProtocol);
//NSLog(@"adding Protocol %d",class_addProtocol([appInstance class], aProtocol));

if ([self.delegate conformsToProtocol:@protocol(TestDelegate)])
{
    NSLog(@"conformed Protocol ..");
}
else
{
    NSLog(@"conformed Protocol ..%d",class_conformsToProtocol([appInstance class], aProtocol));
    class_conformsToProtocol([self.delegate class], aProtocol);
    [appInstance performSelector:@selector(itIsTestDelegate)];
}

Sin embargo, el método delegado debe ser definido con anterioridad en esa clase de lo contrario se bloqueará debido al selector no reconocido

o el método se pueden agregar en tiempo de ejecución .. Entonces todo funcionará bien ..

Pero el siguiente archivo se debe importar en primer lugar.

#include <objc/runtime.h>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top