objective-c - tutorial - objective c ultima version
Objective-C y uso de SEL/IMP (3)
Otra pregunta mía sobre la optimización de los programas de Objective C inspiró lo siguiente: ¿Alguien tiene un pequeño ejemplo que use SEL e IMP cuando el Método tiene dos (o más) enteros para la entrada?
Ahora que estoy trabajando gracias a eman, puedo agregar otro ejemplo:
SEL cardSelector=@selector(getRankOf:::::::);
IMP rankingMethod=[eval methodForSelector:cardSelector];
rankingMethod(eval, cardSelector, 0, 1, 2, 3, 4, 5, 6);
No necesito esto para nada útil, ¡solo necesitaba satisfacer mi curiosidad! Gracias de nuevo.
Aquí hay otra alternativa posible. Esto evita la caída, pero el apago no funciona.
- (void)setUp
{
[super setUp];
[self addSelector@selector(firstName) toClass:[User class]];
[self addSelector@selector(lastName) toClass:[User class]];
}
- (void)addSelector:(SEL)selector toClass:(Class)class
{
NSString *uniqueName = [NSString stringWithFormat:@"%@-%@", NSStringFromClass(class), NSStringFromSelector(selector)];
SEL sel = sel_registerName([uniqueName UTF8String]);
IMP theImplementation = [class methodForSelector:sel];
class_addMethod(class, selector, theImplementation, "v@:@");
}
Aquí hay un buen tutorial para obtener el IMP actual (con una descripción general de los IMP). Un ejemplo muy básico de IMPs y SELs es:
- (void)methodWithInt:(int)firstInt andInt:(int)secondInt { NSLog(@"%d", firstInt + secondInt); }
SEL theSelector = @selector(methodWithInt:andInt:);
IMP theImplementation = [self methodForSelector:theSelector];
//note that if the method doesn''t return void, you have to explicitly typecast the IMP, e.g. int(* foo)(id, SEL, int, int) = ...
Entonces podrías invocar el IMP así:
theImplementation(self, theSelector, 3, 5);
Por lo general, no hay razón para necesitar IMP a menos que estés haciendo un vudú serio. ¿Hay algo específico que quieras hacer?