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

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

 2010-02-22 06:15:00 来源:WEB开发网   
核心提示:"CI_initWithAffineTransform:","CI_initWithRect:","CI_rect","CTM","DOMDocument","DTD",...};可以看到,数组的大小

"CI_initWithAffineTransform:",

"CI_initWithRect:",

"CI_rect",

"CTM",

"DOMDocument",

"DTD",

...

};

可以看到,数组的大小NUM_BUILTIN_SELS定义为16371。字符串按照字母顺序排序,简单的都是为了运行时检索的速度(二分法查找)。

从定义好的 selector 名称我们可以看到一些新的方法名称,比如 CIConetext,CI开头的方法是由Tiger开始导入的程序库。

每次系统更新的时候,这个数组也是需要更新的。

动态追加selector

另一个用于动态追加的 selector,其定义在 objc-sel.m 和 objc-sel-set.m 文件中

新的 selector 都被追加到 _buckets 成员中,其中追加和搜索使用 Hash 算法。

static struct __objc_sel_set *_objc_selectors = NULL;

struct __objc_sel_set {

uint32_t _count;

uint32_t _capacity;

uint32_t _bucketsNum;

SEL *_buckets;

};

IMP

从上面的头文件中我们可以看到,IMP定义为

1

id (*IMP) (id, SEL, …)。

这样说来,IMP是一个指向函数的指针,这个被指向的函数包括id(“self”指针),调用的SEL(方法名),再加上一些其他参数。说白了IMP就是实现方法。

我们取得了函数指针之后,也就意味着我们取得了执行的时候的这段方法的代码的入口,这样我们就可以像普通的C语言函数调用一样使用这个函数指针。当然我们可以把函数指针作为参数传递到其他的方法,或者实例变量里面,从而获得极大的动态性。我们获得了动态性,但是付出的代价就是编译器不知道我们要执行哪一个方法所以在编译的时候不会替我们找出错误,我们只有执行的时候才知道,我们写的函数指针是否是正确的。所以,在使用函数指针的时候要非常准确地把握能够出现的所有可能,并且做出预防。尤其是当你在写一个供他人调用的接口API的时候,这一点非常重要。

方法的定义

在头文件 objc-class.h 中,有方法的定义 :

typedef struct objc_method *Method;

struct objc_method {

SEL method_name;

char *method_types;

IMP method_imp;

};

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

Tags:iPhone 开发 入门

编辑录入:coldstar [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接