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 结语
以上是所有内容,希望对大家有所帮助。