根据C#开发人员可以理解的@selector指令是什么?

时间:2012-06-27 20:09:44

标签: objective-c ios

在这里使用selector的目的是什么?

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

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

我读了定义

  

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

不幸的是,这并不适合我。我的专长是C#。如果您能将答案与C#中可以实现类似解决方案的方式联系起来,我将不胜感激。

2 个答案:

答案 0 :(得分:6)

选择器声明函数的名称。而已。它与Reflection类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

SEL的内部而言,它是一个C-string,它被放入一个私有地图中,以便在运行时查找速度。

答案 1 :(得分: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等,那么选择器类似于回调。同样,第二篇文章有助于解释用途/相似之处/差异。