iOS Weekly #01 | 2019-03-23

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

内容简介:答: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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

千夫所指

千夫所指

乔恩·罗森 / 王岑卉 / 九州出版社 / 2016-10-1 / CNY 42.80

编辑推荐: 《乌合之众》是为了跪舔权贵?《普通心理学》实验存在重大漏洞?《引爆点》的理论都是瞎掰的?社交网络时代《1984》预言的“老大哥”是否已经变成事实? 《纽约时报》年度十佳书 《GQ》杂志年度十佳书 《卫报》年度十佳书 《泰晤士报》年度十佳书 《经济学人》年度重推! 黑天鹅年度重点图书! 《乌合之众》是为了迎合权贵?《普通心理学》实验存在重大......一起来看看 《千夫所指》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具