天天看点

iPhone App开发实战手册学习笔记(8)之Objective-C消息调用原理1 前言2 详述3 结语

1 前言

其实Objective-C只是C加上一点额外的语法和一个运行环境。今天让我们来学习一下其背后的原理。

2 详述

我们先看一个例子:

NSString* myString = @"typing power";
NSString* myResult = [myString awesomeString];
NSLog(@"myResult = %@,myResult");
           

其相当于下面的代码:

#import<objc/objc-runtime.h>
id myString = @"typing power";
SEL mySelector = @selector(awesomeString);
IMP myImp = class_getMethodImplementation(object_getClass(myString),mySelector);
id myResult = myImp(myString,mySelector);
NSLog(@"myResult = %@,myResult");
           

解析:

(1)导入objc-runtime.h头文件。所有的运行环境定义都存放到这里;

(2)为-setMyString方法创建一个选择器。它只是一个内部结构的指针;

(3)SEL数据类型:它是编译器运行Objective-C里的方法的环境参数。这个选择器后被传到运行时函数class_getMethodImplementation(),它用来根据对象的类和选择器查找函数:

typedef struct objc_selector *SEL;

(4)IMP数据类型:他其实就是一个编译器内部实现时候的函数指针。当Objective-C编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型:

typedef id(*IMP)(id,SEL,...);

(5)编译器在遇到方法实现

-(NSString *)awesomeString;

后会生成如下C函数:

id_1_NSString_AwesomeMethods_awesomeString(id self,SEL _cmd);

这个函数名由方法类型(实例或类),类名,类别以及方法名构成。函数的菜蔬列表显示了隐藏的self参数是怎样传递进来的。此外还可以看出还有一个隐藏的参数_cmd,方法的实现可以用它来获知选择器。

当我们输入强大的方括号时,这些都会自动发生:

[self awesomeString];

3 结语

以上是所有内容,希望对大家有所帮助。