objc-公共头文件(Public Headers)的基本内容(

2019-01-21  本文已影响18人  我才是臭吉吉

1. NSObject.h

内部主要包含了NSObject协议NSObject类


2. message.h

2.1 super关键字对应的objc_super结构体

struct objc_super {
    /** 接收者,当前类的实例,即使用super的self */
    __unsafe_unretained _Nonnull id receiver;
    /** 父类的指针 */
    __unsafe_unretained _Nonnull Class super_class;
}

2.2 基本的消息原型

对象调用方法,即给对象发消息,调用objc_msgSend方法,而根据参数类型的不同,系统会自动调用对应的子版本;而通过对象,调用父类的方法,调用objc_msgSendSuper方法

id _Nullable objc_msgSend(id _Nullable self, SEL _Nullable op, ...)

说明:

  • self,对象,即为id(指向objc_object实例的指针)
  • op即为SEL,objc_selector的实例指针,运行时系统可以通过SEL找到方法实现IMP
  • 后面为方法调用的参数
id _Nullable objc_msgSendSuper(
    struct objc_super * _Nullable super, 
    SEL _Nullable op,
    ...
)

说明:

  • super,即为上述objc_super结构体实例的指针
  • op为SEL
  • 后面传入调用参数

3. objc.h

3.1 Class

Class,类对象,即objc_class的结构体实例指针:

typedef struct objc_class *Class;

3.2 对象

对象,指的是Class的实例,默认即为id类型的变量:

typedef struct objc_object *id;
struct objc_object {
    Class _Nonnull isa;
}

3.3 选择器及实现

typedef struct objc_selector *SEL;
typedef id _Nullable (*IMP)(id _Nonnull, SEL _Nonnull, ...)

3.4 主要方法API

const char * _Nonnull sel_getName(SEL _Nonnull sel);
SEL _Nonnull sel_registerName(const char * _Nonnull str);

在将方法添加到类定义中之前,必须先注册SEL

const char * _Nonnull object_getClassName(id _Nullable obj);
上一篇下一篇

猜你喜欢

热点阅读