Еще один мой вопрос о оптимизации программ Objective C вдохновил следующее: есть ли у кого-нибудь короткий пример использования SEL и IMP, когда у методаMethod есть два (или более) целых числа для вход?
Objective-C и использование SEL/IMP
Ответ 1
Здесь хороший учебник для получения текущего IMP (с обзором IMP). Очень простой пример IMP и SELs:
- (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) = ...
Затем вы можете вызвать IMP следующим образом:
theImplementation(self, theSelector, 3, 5);
Как правило, нет причин для использования IMP, если вы не делаете серьезного вуду - есть ли что-то конкретное, что вы хотите сделать?
Ответ 2
Теперь, когда я работаю благодаря eman, я могу добавить еще один пример:
SEL [email protected](getRankOf:::::::);
IMP rankingMethod=[eval methodForSelector:cardSelector];
rankingMethod(eval, cardSelector, 0, 1, 2, 3, 4, 5, 6);
Мне это не нужно для чего-нибудь полезного, мне просто нужно было удовлетворить свое любопытство! Еще раз спасибо.
Ответ 3
Вот еще одна возможная альтернатива. Это позволяет избежать сбоя, но укупорка не работает.
- (void)setUp
{
[super setUp];
[self [email protected](firstName) toClass:[User class]];
[self [email protected](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, "[email protected]:@");
}