代表们的目标c

hum*_*rim 3 c# cocoa delegates objective-c

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

Dir*_*irk 15

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
Run Code Online (Sandbox Code Playgroud)

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

class Action {

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

typedef void (*callback_function)();

- (void) doSomethingWithCallback: (callback_function) func {
    ...
    func();
}
Run Code Online (Sandbox Code Playgroud)

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

- (void) doSomethingWhenDonePerform: (SEL)aSelector onObject: (id) aReceiver {
    ...
    [aReceiver perform: aSelector];
}
Run Code Online (Sandbox Code Playgroud)


小智 6

C#委托就像NSInvocations在Objective-C中一样:

  • 每个人都知道将成为呼叫目标的对象
  • 每个人都知道将被调用的方法

然而,NSInvocation更进一步:

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

你可能不会NSInvocation用来实现像C#delegates这样的模式(这是一种代理模式).我个人选择使用一个对象,它使用运行时的标准消息转发功能将收到的消息转发给目标对象.