在C#中,您可以创建委托方法,将其分配给变量或将其传递给方法,就好像它是变量一样。例如:
public delegate int Lookup(String s);
//...
public static int Evaluate(String exp, Lookup variableEvaluator)
{
//...
}
我听说在C中你可以创建一个指向任何方法的指针,然后将该指针传递给一个方法。 任何人都可以给我一个在Objective-C中做到这一点的简单例子吗?当然,我可以使用单一方法创建一个对象,并将该对象传递给一个方法。但我很好奇是否有办法与C#或C类似。
答案 0 :(得分:2)
很多方法。
一个:好的。使用块(闭包,lambda演算,无论你怎么称呼):
typedef void (^MyCallback)();
- (void)callTheCallback:(MyCallback)blockToInvoke
{
blockToInvoke();
}
MyCallback cb = ^{
NSLog(@"I was called! :D");
};
[self callTheCallback:cb];
二:坏。抓住一个指向方法函数本身的指针并调用它。 (警告:如果你使用这种方法,我会起诉你。)
- (void)callTheCallback:(IMP)funcPtrToCall withObject:(id)obj selector:(SEL)sel
{
funcPtrToCall(obj, sel);
}
- (void)someCallbackMethod
{
NSLog(@"I was called! :D");
}
IMP implemt = [[self class] instanceMethodForSelector:@selector(someCallbackMethod)];
[self callTheCallback:implemt withObject:self selector:@selector(someCallbackMethod)];
三:丑陋。使用委托:
- (void)delegateMethodOfSomeObject:(SomeObject *)obj
{
NSLog(@"I was called! :D");
}
SomeObject *obj = [[SomeObject alloc] init];
obj.delegate = self;
[obj makeThisObjectSomehowCallItsDelegateThatIsCurrentlySelf];
答案 1 :(得分:1)
想到两个快速的想法。
简短的回答称为“积木”,但它的水平低于您所需要的水平。
“清洁”解决方案(读取:更高级别)是传递两个参数:和对象(称为“目标”)和选择器(称为“动作”)。这是Objective-C中非常常见的模式,所以我只展示这个模式。如果您对块概念感兴趣,check out this doc。
本质上,对象应作为id传递,选择器作为SEL传递,我们有方便的@selector()构造:
-(void) doThingWithTarget:(id) targetObj action:(SEL) actionSel {
if([targetObj respondsToSelector:actionSel]) {
[targetObj performSelector:actionSel withObject:self];
}
}
// ...
[thatOtherObject doThingWithTarget:self action:@selector(myMethod:)];
// ... where
-(void) myMethod:(id) sender {
// sender is the calling object, or should be by contract.
}
答案 2 :(得分:0)