WEB开发网
开发学院手机开发iPhone 开发 iPhone 开发入门——从 C/C++ 语言到 Objective-C... 阅读

iPhone 开发入门——从 C/C++ 语言到 Objective-C 语言

 2010-02-22 06:15:00 来源:WEB开发网   
核心提示:SELSEL是“selector”的一个类型,表示一个方法的名字,iPhone 开发入门——从 C/C++ 语言到 Objective-C 语言(4),比如以下方法:-[Foo count] 和 -[Bar count] 使用同一个selector,它们的selector叫做count,总共有两种 selector 的

SEL

SEL是“selector”的一个类型,表示一个方法的名字。比如以下方法:

-[Foo count] 和 -[Bar count] 使用同一个selector,它们的selector叫做count。

在上面的头文件里我们看到,SEL是指向 struct objc_selector的指针,但是objc_selector是什么呢?那么实际上,你使用GNU Objective-C的运行时间库和NeXT Objective-C的运行运行时间库(Mac OS X使用NeXT的运行时间库)时,它们的定义是不一样的。实际上Mac OSX仅仅将SEL映射为C字符串。比如,我们定义一个Foo的类,这个类带有一个- (int) blah方法,那么以下代码:

1

NSLog (@"SEL=%s", @selector(blah));

会输出为 SEL=blah。说白了SEL就是返回方法名。

这样的机制大大的增加了我们的程序的灵活性,我们可以通过给一个方法传递SEL参数,让这个方法动态的执行某一个方法;我们也可以通过配置文件指定需要执行的方法,程序读取配置文件之后把方法的字符串翻译成为SEL变量然后给相应的对象发送这个消息。

在 Objective-C 运行时库中,selector 是作为数组来管理的。这都是从效率的角度出发:函数调用的时候,不是通过方法名字比较而是指针值的比较来查找方法,由于整数的查找和匹配比字符串要快得多,所以这样可以在某种程度上提高执行的效率。

这样就必须保证所有类中的 selector 须指向同一实体(数组)。一旦有新的类被定义,其中的 selector 也需要映射到这个数组中。

实际情况下,总共有两种 selector 的数组:预先定义好的内置selector数组和用于动态追加的selector数组。

内置selector

简单地说,内置的selector就是一个大的字符串数组。定义在objc-sel-table.h文件中:

#define NUM_BUILTIN_SELS 16371

/* base-2 log of greatest power of 2 < NUM_BUILTIN_SELS */

#define LG_NUM_BUILTIN_SELS 13

static const char * const _objc_builtin_selectors[NUM_BUILTIN_SELS] = {

".cxx_construct",

".cxx_destruct",

"CGColorSpace",

"CGCompositeOperationInContext:",

"CIContext",

"CI_affineTransform",

"CI_arrayWithAffineTransform:",

"CI_copyWithZone:map:",

上一页  1 2 3 4 5 6 7 8  下一页

Tags:iPhone 开发 入门

编辑录入:coldstar [复制链接] [打 印]
赞助商链接