iOS Weekly #01 | 2019-03-23

栏目: Objective-C · 发布时间: 6年前

内容简介:答:Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。也就是说,有很多类和成员变量在我们编译的时是不知道的,而在运行时,我们所编写的代码会转换成完整的确定的代码运行。因此,只有编译器是不够的,我们还需要一个运行时系统(Runtime system)来处理编译后的代码。 这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一块基石。平时编写的OC代码,底层都是由他实现的,如:答: 见下一问

答:Objective-C 是一门动态语言,它会将一些工作放在代码运行时才处理而并非编译时。也就是说,有很多类和成员变量在我们编译的时是不知道的,而在运行时,我们所编写的代码会转换成完整的确定的代码运行。因此,只有编译器是不够的,我们还需要一个运行时系统(Runtime system)来处理编译后的代码。 这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一块基石。

平时编写的OC代码,底层都是由他实现的,如:

[receiver message];
//底层运行时会被编译器转化为:
objc_msgSend(receiver, selector)
//如果其还有参数比如:
[receiver message:(id)arg...];
//底层运行时会被编译器转化为:
objc_msgSend(receiver, selector, arg1, arg2, ...)

复制代码

根元类的isa指针指向谁

答: 见下一问

根元类的superClass指针指向谁

答:这两题一起回答。首先看下图:

iOS Weekly #01 | 2019-03-23

先说几个概念:

1)supercalss : 父类

2)subclass: 子类

3)isa : 概念不好说,官方文档说的也不清晰。作用是根据 isa 指针就可以找到对象所属的类,但是isa指针在代码运行时并不总指向实例对象所属的类型,所以不能依靠它来确定类型,要想确定类型还是需要用对象的 -class 方法。(PS:KVO 的实现机理就是将被观察对象的isa指针指向一个中间类而不是真实类型。)

4)class : 类,一个运行时类中关联了它的父类指针、类名、成员变量、方法、缓存以及附属的协议。(一个实例对象是一个类的实例)

5)meta class :元类,Objc 类本身也是一个对象 ,类对象所属的类就叫做元类(一个类是元类的实例)

第一列是类的实例变量,如:[Person new]或者[[Person alloc] init]出来的对象;

第二列是类本身,存放父类指针、类名、成员变量、方法、缓存以及附属的协议的信息;

第三列是元类

1):isa路线:

实例对象的isa指向Class,Class的isa指向Meta Class,Meta Class的isa指向根元类Root Meta Class,根元类的isa指向自己

2):superclass路线:

a)、实例对象没有superclass ;

b)、实例对象所在的类,存在superclass,类的superclass后面会指向Root Class,Root Class的super Class是nil;

c)、元类也存在superclass,元类的superclass后面会指向Root Meta Class,而Root Meta Class的superclass却是Root Class。

所以: 根元类的isa指针指向自己 根元类的superclass指向nil

附旧版Class结构:

typedef struct objc_class *Class;
Class 其实是指向 objc_class 结构体的指针。objc_class 的数据结构如下:
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;

复制代码

旧版

iOS Weekly #01 | 2019-03-23

新版

iOS Weekly #01 | 2019-03-23

函数四要素都是什么

答:函数名,函数参数,参数类型,返回值类型(PS:ObjC一般叫方法,不叫函数)

OC method简单介绍:

typedef struct objc_method *Method;
struct objc_method {
    SEL method_name OBJC2_UNAVAILABLE;  //方法名
    char *method_types OBJC2_UNAVAILABLE;   //方法类型
    IMP method_imp OBJC2_UNAVAILABLE;   //方法实现
}
复制代码

objc_method 存储了方法名,方法类型和方法实现。

方法名类型为 SEL

方法类型 method_types 是个 char 指针,存储方法的参数类型和返回值类型 method_imp 指向了方法的实现,本质是一个函数指针 Ivar Ivar 是表示成员变量的类型。

typedef struct objc_ivar *Ivar;
struct objc_ivar {
    char *ivar_name OBJC2_UNAVAILABLE;
    char *ivar_type OBJC2_UNAVAILABLE;
    int ivar_offset OBJC2_UNAVAILABLE;
#ifdef __LP64__
    int space OBJC2_UNAVAILABLE;
#endif
}
复制代码

其中 ivar_offset 是基地址偏移字节

IMP

IMP在objc.h中的定义是:

typedef id (*IMP)(id, SEL, ...);
复制代码

它就是一个函数指针,这是由编译器生成的。当你发起一个 ObjC 消息之后,最终它会执行的那段代码,就是由这个函数指针指定的,而 IMP 这个函数指针就指向了这个方法的实现。


以上所述就是小编给大家介绍的《iOS Weekly #01 | 2019-03-23》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Seasoned Schemer

The Seasoned Schemer

Daniel P. Friedman、Matthias Felleisen / The MIT Press / 1995-12-21 / USD 38.00

drawings by Duane Bibbyforeword and afterword by Guy L. Steele Jr.The notion that "thinking about computing is one of the most exciting things the human mind can do" sets both The Little Schemer (form......一起来看看 《The Seasoned Schemer》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具