ami*_*mir 16 comparison events delegates objective-c selector
我正在寻找在目标c中使用委托和事件的好示例代码?我熟悉C#中的委托和事件.
所以,如果有人能用几行代码帮助我,那将非常有帮助.
har*_*rms 22
请注意,C#有一个名为"委托"的术语,而Objective-C有一个名为"委托"的术语,但两者几乎没有任何共同之处.
C#"委托"本质上是一个类型安全的函数指针.Objective-C中的函数指针的等价物称为"选择器".
要将参数,成员变量或局部变量声明为选择器,请将类型声明为SEL.例如,在NSTimer类的头文件中,您可以找到此方法:
- (id)initWithFireDate:(NSDate *)date
interval:(NSTimeInterval)seconds
target:(id)target
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats;
Run Code Online (Sandbox Code Playgroud)
这意味着在使用此方法时,您打算将选择器作为第四个参数传递.你可以这样称呼它:
[[NSTimer alloc] initWithFireDate: someDate
interval: someInterval
target: self
selector: @selector(myTimerCallback:)
userInfo: nil
repeats: NO];
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,通过编写@selector(some-name-here),我可以构造一个新的选择器(类似于我可以通过编写来构造一个新的字符串@"some text here").Objective-C方法在其中插入参数的"漏洞",这些漏洞前面是冒号.当如上所述编写选择器时,您保留冒号,但删除所有其他.例如,你可以写类似的东西@selector(firstPart:secondPart:thirdPart:).
接受选择器的方法的文档通常应该说明允许哪种签名.编译器不会为您强制执行此操作(这与C#委托人非常不同).
另请注意,上述方法要求"目标"参数.这通常是调用选择器的对象.请注意,目标是完全无类型的id.编译器不会尝试强制您作为目标传入的对象实际上将响应选择器指示的方法.如果它没有响应,那么这是一个运行时错误.这是Objective-C的动态特性的一部分.
(Objective-C"委托"概念实际上只是委托模式(查找它),这在Objective-C中非常普遍,经常用于其他langauges使用继承的地方.)
关于事件,有一个NSEvent类,但我还没有任何经验.它似乎是对GUI事件的相当低级别的处理.C#用于事件可能更类似于Objective-C中的"动作".
通常,诸如按钮的GUI组件具有与其相关联的"动作"和"目标".您可以在代码或Interface Builder中设置它们.目标如上所述 - 将在其上调用方法的对象.而"动作"实际上只是一个选择器.
请阅读Apple文档中此Cocoa基础知识文章的 "目标 - 行动机制"部分.事实上,整个页面都与您的问题的两个部分相关,因此我非常推荐它.