您的位置:首页 > 移动开发 > Objective-C

C++的this,Objective-C的self

2014-04-15 22:43 274 查看
C++中定义类的实例方法如下:

void MyClass::method(int arg) {
printf("%p %d\n", this, arg);
}

C++编译器将该方法作为C语言函数来处理。

void __ZN7MyClass6methodEi(MyClass *this, int arg) {
printf("%ps %d\n", this, arg);
}

MyClass:method方法的实质就是__ZN7MyClass6methodEi函数。“this”作为第一个参数传递进去。该方法的调用如下:

MyClass cls;
cls.method(10);

该源代码通过C++编译器转换成C语言函数调用的形式:

struct MyClass cls;
__ZN7MyClass6methodEi(&cls, 10);

即this就是MyClass类(结构体)的实例。

同样,我们也来看一下Objective-C的实例方法:

-(void)method:(int)arg {
NSLog("%p %d\n", self, arg);
}

Objective-C编译器同C++的方法一样,也将该方法作为C语言的函数来处理。

void _I_MyObject_method_(struct MyObject *self, SEL _cmd, int arg) {
NSLog("%p %d\n", self, arg);
}

与C++中变换结果的this相同,“self”作为第一个参数被传递过去。以下为调用代码。

MyOjbect *obj = [[MyObject alloc] init];
[obj method:10];

如果使用clang的-rewrite-objc选项,则上面源代码会转换为:

MyObject *obj = objc_msgSend(objc_getClass("MyObject"), sel_registerName("alloc"));
obj = objc_msgSend(obj, sel_registerName("init"));
objc_msgSend(obj, sel_registerName("method:"), 10);

objc_msgSend函数根据指定的对象和函数名,从对象持有类的结构体中检索_I_MyObject_method_函数的指针并调用。此时,objc_msgSend函数的第一个参数obj作为_I_MyObject_method_函数的第一个参数self进行传递。同C++一样,self就是MyObject类的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: