代表们的目标c

时间:2010-12-15 11:29:03

标签: c# objective-c cocoa delegates

首先我应该告诉你,我对Objective C或C#知之甚少。所以,当我的一位同事问我是否有类似于Objective C的代表时,我想知道Objective-CI中是否存在这样的概念猜测代表们我们在iphone编程中使用的是不一样的.C#委托是函数指针吗?在处理多个视图时,这样的设施会很好。我在哪里可以找到信息?

2 个答案:

答案 0 :(得分:14)

Objective-C中的委托只是一个概念,而不是某种实现工件(如C#中)。 Objective-C中的委托(更好:Cocoa)基本上是一个对象,由任何人使用它作为其发生的某些事件的“委托”。也可能要求代表代表主机对象执行某些任务。委托人需要实现的接口通常由协议形式化。

@protocol ActionDelegate 

- (void) actionDidStart: (id) aSender;
- (void) actionDidEnd: (id) aSender;

@end

@interface Action: NSObject {
    id<ActionDelegate> delegate;
}

@property (nonatomic,assign) id<ActionDelegate> delegate;

@end

另一方面,C#中的代表是一个实现工件。有一个专用的delegate关键字来声明委托类型并创建实际的委托实例。

class Action {

    delegate void ActionDidStartDelegate(Action sender);
    delegate void ActionDidEndDelegate(Action sender);

    ...
}

(我的C#有点生疏,所以语法可能在这里,对不起;在现实生活中,人们可能会在上述情况下使用事件而不是原始代表)。基本上,C#委托类似于Python方法对象。

您可以使用Objective-C的新代码块功能来模拟委托。尚未使用此功能,我无法对此发表评论。获得类似内容的另一种方法是使用普通函数指针。

typedef void (*callback_function)();

- (void) doSomethingWithCallback: (callback_function) func {
    ...
    func();
}

当然,您总是可以使用Cocoa本身经常使用的方法:使用对象和关联的方法选择器:

- (void) doSomethingWhenDonePerform: (SEL)aSelector onObject: (id) aReceiver {
    ...
    [aReceiver perform: aSelector];
}

答案 1 :(得分:6)

C#委托与Objective-C中的NSInvocations类似:

  • 每个人都知道将成为通话目标的对象
  • 每个人都知道将要调用的方法

然而,NSInvocation更进一步:

  • 它知道传递给方法的参数
  • 它可以存储返回值

您可能不会使用NSInvocation来实现类似C#委托(这是代理模式的一种形式)的模式。我个人选择使用一个对象,它使用运行时的标准消息转发功能将它接收的消息转发到目标对象。