Objective-C 和 SEL/IMP 的使用

问题描述 投票:0回答:3

我的另一个关于优化 Objective C 程序的问题启发了以下内容:当 theMethod 有两个(或更多)整数用于输入时,是否有人有一个使用 SEL 和 IMP 的简短示例?

objective-c
3个回答
50
投票

这里有一个很好的教程,用于获取当前的 IMP(包含 IMP 的概述)。 IMP 和 SEL 的一个非常基本的示例是:

- (void)methodWithInt:(int)firstInt andInt:(int)secondInt { NSLog(@"%d", firstInt + secondInt); }

SEL theSelector = @selector(methodWithInt:andInt:);
typedef void (*MyMethodImplementation)(id, SEL, int, int);
MyMethodImplementation theImplementation = (MyMethodImplementation)[self methodForSelector:theSelector];

然后您可以像这样调用 IMP:

theImplementation(self, theSelector, 3, 5);

通常没有理由需要 IMP,除非你正在做严重的巫毒——你有什么具体想做的事吗?


2
投票

现在我已经通过 eman 完成了这项工作,我可以添加另一个例子:

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

IMP rankingMethod=[eval methodForSelector:cardSelector];

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

我不需要这个有什么用处,我只是需要满足我的好奇心!再次感谢您。


2
投票

这是另一种可能的选择。这可以避免崩溃,但存根不起作用。

- (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@:@");
}
© www.soinside.com 2019 - 2024. All rights reserved.