Top Banner
Obj-C中的selfsuper twitter:@vonbo 11年1月24日星期一
15

self and super in objc

May 11, 2015

Download

Technology

Vonbo

explain self and super in objc's class
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: self and super in objc

Obj-C中的self与super

twitter:@vonbo

11年1月24日星期一

Page 2: self and super in objc

输出结果?

11年1月24日星期一

Page 3: self and super in objc

输出结果?

11年1月24日星期一

Page 4: self and super in objc

输出结果?

self class is Derivedsuper class is Derived

11年1月24日星期一

Page 5: self and super in objc

obj-c的方法调用• [self class] or [super class]

• self 是类的隐藏的参数,指向当前当前调用方法的对象

• super是一个“编译器指示符”,它和self指向的是相同的消息接收者,不同的是,super告诉编译器,当调用class的方法时,要去调用父类的方法,而不是本类里的

11年1月24日星期一

Page 6: self and super in objc

C函数方法调用 -1

• Sending Messages

• When it encounters a method invocation, the compiler might generate a call to any of several functions to perform the actual message dispatch, depending on the receiver, the return value, and the arguments.

• You can use these functions to dynamically invoke methods from your own plain C code, or to use argument forms not permitted by NSObject’s perform… methods. These functions are declared in /usr/include/objc/objc-runtime.h.

11年1月24日星期一

Page 7: self and super in objc

C函数方法调用 -2• objc_msgSend sends a message with a simple

return value to an instance of a class.

• objc_msgSend_stret sends a message with a data-structure return value to an instance of a class.

• objc_msgSendSuper sends a message with a simple return value to the superclass of an instance of a class.

• objc_msgSendSuper_stret sends a message with a data-structure return value to the superclass of an instance of a class.uperclass of an instance of a class.

11年1月24日星期一

Page 8: self and super in objc

objc_msgSend

• 函数定义:• id objc_msgSend(id theReceiver, SEL

theSelector, ...)

• [self class]:

• theReceiver -> self

• SEL -> class

11年1月24日星期一

Page 9: self and super in objc

objc_msgSendSuper

• 函数定义:• id objc_msgSendSuper(struct objc_super

*super, SEL op, ...)

• [super class]

• objc_super -> some struct?

• SEL -> class

11年1月24日星期一

Page 10: self and super in objc

objc_super

struct objc_super {

id receiver;

Class superClass;

}

11年1月24日星期一

Page 11: self and super in objc

objc_msgSendSuper

• [super class]:

• 构建objc_super结构体,receiver = self,superClass = Base

• 调用objc_msgSendSuper方法,通过objc_super -> superClass找到selector

• 将此selector作用到objc_super -> receiver上

11年1月24日星期一

Page 12: self and super in objc

That is ...• [self class]

• objc_msgSend(receiver, class)

• receiver = Derived, “class” selector is from NSObject

• [super class]

• objc_msgSendSuper(objc_super, class)

• ==> objc_msgSend(objc_super -> receiver, class)

• receiver = Derived, “class” selector is from NSObject

• NSObject的这个class方法,就是返回receiver的class

11年1月24日星期一

Page 13: self and super in objc

That is ...

• [self class]

• objc_msgSend(receiver, class)

• receiver = Derived, class method is from NSObject

• [super class]

• objc_msgSendSuper(objc_super, class)

• ==> objc_msgSend(objc_super -> receiver, class)

• receiver = Derived, class method from NSObject

• NSObject的这个class方法,就是返回receiver的class

So ... [self class] ‘s output is Derived [super class] ‘s output is Derived too !

11年1月24日星期一

Page 14: self and super in objc

How to get super class’s name?

• [self superclass]

• NSLog(@"super class is %@", [self superclass]);

• The output is “Base” !

11年1月24日星期一

Page 15: self and super in objc

The End

11年1月24日星期一