传递目标C中的方法

时间:2012-10-12 20:31:38

标签: objective-c delegates

在C#中,您可以创建委托方法,将其分配给变量或将其传递给方法,就好像它是变量一样。例如:

public delegate int Lookup(String s);
//...
public static int Evaluate(String exp, Lookup variableEvaluator)
{
//...
}

我听说在C中你可以创建一个指向任何方法的指针,然后将该指针传递给一个方法。 任何人都可以给我一个在Objective-C中做到这一点的简单例子吗?当然,我可以使用单一方法创建一个对象,并将该对象传递给一个方法。但我很好奇是否有办法与C#或C类似。

3 个答案:

答案 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)