博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS底层-对象的本质
阅读量:6560 次
发布时间:2019-06-24

本文共 2605 字,大约阅读时间需要 8 分钟。

The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the language requires not just a compiler, but also a runtime system to execute the compiled code. The runtime system acts as a kind of operating system for the Objective-C language; it’s what makes the language work. Objective-C语言尽可能多地推迟从编译时和链接时到运行时的决策。只要有可能,它就会动态地执行操作。这意味着该语言不仅需要编译器,还需要运行时系统来执行编译后的代码。运行时系统作为Objective-C语言的一种操作系统;这就是语言的工作原理。

首先今天写这篇博客是对学习的记录

那么什么是运行时?什么叫编译时?

  • 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言) 那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.如果你用微软的VS的话,点下build.那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的.所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态嘛就是没把真把代码放内存中运行起来,而只是把代码当作文本来扫描下).所以有时一些人说编译时还分配内存啥的肯定是错误的说法.

  • 所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.

对象的本质

我现在就来测试 : 下面是一个LGPerson对象

LGPerson *p = [LGPerson new];clang -rewrite-objc main.m -o mian.cpp复制代码

因为我们都知道OC底层是C,我们进一步可以编译C++代码(重写)

通过C++编译 我的天啊. 9851行代码吓我一哆嗦,不过没关系.作为一名优秀iOS底层开发人员,谁没见过一万行代码似的!况且很多我都不需要考虑,里面有很多结构体,都是一些引入,还有很多函数,也不是我们关心的,我们把文件拖到最下面

int main(int argc, const char * argv[]) {    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;         LGPerson *p = ((LGPerson *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("LGPerson"), sel_registerName("new"));        LGStudent*s = ((LGStudent *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("LGStudent"), sel_registerName("new"));        ((void (*)(id, SEL))(void *)objc_msgSend)((id)p, sel_registerName("run"));        ((void (*)(id, SEL))(void *)objc_msgSend)((id)s, sel_registerName("walk"));    }    return 0;}复制代码

这就有点熟悉了,这不是我们main函数的编译? 然后先不管下面的方法调用的编译,我们全局查找LGPerson

#ifndef _REWRITER_typedef_LGPerson#define _REWRITER_typedef_LGPersontypedef struct objc_object LGPerson;typedef struct {} _objc_exc_LGPerson;#endifstruct LGPerson_IMPL {    struct NSObject_IMPL NSObject_IVARS;};复制代码

很明显的一句话typedef struct objc_object LGPerson; 那么我们的LGPerson 就是objc_object类型的结构体~~~那么我们所说的对象预计都是objc_object类型的结构体!我们带着好奇心继续查看objc_object

struct objc_object {    Class _Nonnull isa __attribute__((deprecated));};复制代码

非常熟悉的身形isa 这个时候我就想到了另外一个东西NSObject

typedef struct objc_object NSObject;struct NSObject_IMPL {    Class isa;};复制代码

我们的NSObjectisaobjc_object结构体重的属性在我们实现NSObject的时候只是对isa的重写~~~isa也是我们后面后面学习非常重要的路线.比如我们编译block也能看到isa,代表这个匿名函数也是对象,也重复符合万物皆对象的说法!!!

转载于:https://juejin.im/post/5ce6320e51882529014ede88

你可能感兴趣的文章
ARM相关知识汇总
查看>>
ubuntu创建rubymine idea的快捷方式
查看>>
java将HTML转换成TXT
查看>>
力洋VIN码解析
查看>>
osd内的pg数量
查看>>
shell脚本与mysql交互方法汇总
查看>>
Tomcat7-优化配置
查看>>
获取piwik里存的ip地址。
查看>>
图形上下文栈
查看>>
Cron 表达式详解和案例
查看>>
Android - 软件自动更新的实现
查看>>
我的友情链接
查看>>
oracle数据库远程不落地导入本地数据库
查看>>
OpenCascade Application Framework Introduction
查看>>
OpenCASCADE General Transformation
查看>>
Hive简介及源码编译
查看>>
每日笔记
查看>>
spring cloud config与bus结合
查看>>
PPP PAP 认证
查看>>
iPhone6如何进入DFU模式
查看>>