我的另一个关于优化 Objective C 程序的问题启发了以下内容:当 theMethod 有两个(或更多)整数用于输入时,是否有人有一个使用 SEL 和 IMP 的简短示例?
这里有一个很好的教程,用于获取当前的 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,除非你正在做严重的巫毒——你有什么具体想做的事吗?
现在我已经通过 eman 完成了这项工作,我可以添加另一个例子:
SEL cardSelector=@selector(getRankOf:::::::);
IMP rankingMethod=[eval methodForSelector:cardSelector];
rankingMethod(eval, cardSelector, 0, 1, 2, 3, 4, 5, 6);
我不需要这个有什么用处,我只是需要满足我的好奇心!再次感谢您。
这是另一种可能的选择。这可以避免崩溃,但存根不起作用。
- (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@:@");
}