Objective-C и использование SEL / IMP - PullRequest
23 голосов
/ 16 апреля 2010

Еще один мой вопрос об оптимизации программ на Objective C вдохновил меня на следующее: есть ли у кого-нибудь короткий пример использования SEL и IMP, когда у метода есть два (или более) целых числа для ввода?

Ответы [ 3 ]

49 голосов
/ 16 апреля 2010

Вот хороший учебник для получения текущего IMP (с обзором IMP). Очень простой пример IMP и SEL:

- (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);

Как правило, нет необходимости в ИМП, если вы не занимаетесь серьезным вуду - вы хотите что-то конкретное?

1 голос
/ 18 сентября 2012

Вот еще одна возможная альтернатива. Это позволяет избежать сбоя, но заглушка не работает.

- (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@:@");
}
1 голос
/ 21 апреля 2010

Теперь, когда у меня все работает благодаря eman, я могу добавить еще один пример:

SEL cardSelector=@selector(getRankOf:::::::);

IMP rankingMethod=[eval methodForSelector:cardSelector];

rankingMethod(eval, cardSelector, 0, 1, 2, 3, 4, 5, 6);

Мне это не нужно для чего-то полезного, мне просто нужно было удовлетворить свое любопытство! Еще раз спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...