1

在这里使用选择器的目的是什么?

CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)];

来源:来自初学者 OpenGL es 2.0 网站的代码

我读了定义

@selector() 指令允许您引用已编译的选择器,而不是完整的方法名称。

不幸的是,这并没有让我明白。我的专长是 C#。因此,如果您能将答案与如何在 C# 中实现类似的解决方案联系起来,我将不胜感激。

4

2 回答 2

6

选择器声明函数的名称。而已。它与反射类非常相似MethodInfo,但使用起来要简单得多。

C# 和 Objective-C 的比较:注意 C# 代码可能有点偏离,因为我已经很长时间没有使用它了

// C#
using namespace system.reflection;

class someClass {
     void someMethod(object input) {
           string methodName = "doSomething";

           input.getType().getMethod(methodName).invoke(input, new Object[] { });
     }
}

// OBJC
@implementation someClass 

-(void) someMethod:(id) input
{
     SEL methodName = @selector(doSomething);

     [input performSelector:methodName];
}

@end

就 a 的内部SEL结构而言,它C-string已被放入私有映射中以提高运行时的查找速度。

于 2012-06-27T20:23:18.350 回答
0

这里有两个链接可以很好地解释它们。第一个是 Apple 关于选择器的文档,第二个是关于选择器、委托和块(相对较新)之间的区别。

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocSelectors.html

http://bradcupit.tumblr.com/post/3431169229/ios-blocks-vs-selectors-and-delegates

编辑:

哦,不是 C#,但如果你熟悉 javaScript 之类的,选择器类似于回调。同样,第二篇文章有助于解释用途/相似之处/差异。

于 2012-06-27T20:16:58.753 回答