iOS底层原理
Style_月月
越努力,越幸运
展开
-
iOS-底层原理 25:多线程原理
iOS 底层原理 文章汇总本文的目的在于了解进程、线程、多线程、线程池等的基本概念及原理线程 和 进程线程和进程的定义线程线程时进程的基本执行单元,一个进程的所有任务都在线程中执行进程要想执行任务,必须的有线程,进程至少要有一条线程程序启动会默认开启一条线程,这条线程被称为 主线程 或者 UI线程进程进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内通过“活动监视器”可以查看mac系统中所开启的线程所以,可以简单的理解.原创 2020-11-24 16:28:44 · 982 阅读 · 1 评论 -
iOS-底层原理 24:内存五大区
iOS 底层原理 文章汇总在iOS中,内存主要分为栈区、堆区、全局区、常量区、代码区五大区域。如下图所示下面分别介绍这五大区栈区(Stack)定义栈是系统数据结构,其对应的进程或者线程是唯一的栈是向低地址扩展的数据结构栈是一块连续的内存区域,遵循先进后出(FILO)原则栈的地址空间在iOS中是以0X7开头栈区一般在运行时分配存储栈区是由编译器自动分配并释放的,主要用来存储局部变量函数的参数,例如函数的隐藏参数(id self,SEL _cmd).原创 2020-11-24 16:27:03 · 814 阅读 · 3 评论 -
iOS-底层原理 23:KVO 底层原理
iOS 底层原理 文章汇总KVO,全称为Key-Value observing,中文名为键值观察,KVO是一种机制,它允许将其他对象的指定属性的更改通知给对象。在Key-Value Observing Programming Guide官方文档中,又这么一句话:理解KVO之前,必须先理解KVCIn order to understand key-value observing, you must first understand key-value coding.在iOS日常开发中,经常使用.原创 2020-10-31 21:20:16 · 860 阅读 · 0 评论 -
iOS-底层原理 22:KVC 底层原理
iOS 底层原理 文章汇总KVC的全称是Key-Value Coding,翻译成中文是 键值编码,键值编码是由NSKeyValueCoding非正式协议启用的一种机制,对象采用该协议来间接访问其属性。既可以通过一个字符串key来访问某个属性。这种间接访问机制补充了实例变量及其相关的访问器方法所提供的直接访问。KVC 相关API常用方法主要有以下四个常用的方法通过key 设值/取值//直接通过Key来取值- (nullable id)valueForKey:(NSString *)key.原创 2020-10-31 21:18:42 · 712 阅读 · 2 评论 -
iOS-底层原理 21:Method-Swizzling 方法交换
iOS 底层原理 文章汇总method-swizzling 是什么?method-swizzling的含义是方法交换,其主要作用是在运行时将一个方法的实现替换成另一个方法的实现,这就是我们常说的iOS黑魔法,在OC中就是利用method-swizzling实现AOP,其中AOP(Aspect Oriented Programming,面向切面编程)是一种编程的思想,区别于OOP(面向对象编程)OOP和AOP都是一种编程的思想ios_lowLevelOOP编程思想更加倾向于对业务模块的.原创 2020-10-25 14:20:27 · 1325 阅读 · 0 评论 -
iOS-底层原理 20:OC底层面试解析
iOS 底层原理 文章汇总【面试-1】Runtime Asssociate方法关联的对象,需要在dealloc中释放?当我们对象释放时,会调用dealloc1、C++函数释放 :objc_cxxDestruct2、移除关联属性:_object_remove_assocations3、将弱引用自动设置nil:weak_clear_no_lock(&table.weak_table, (id)this);4、引用计数处理:table.refcnts.erase(this)5、销毁对象.原创 2020-10-24 20:21:49 · 658 阅读 · 0 评论 -
iOS-底层原理 19:类扩展 与 关联对象 底层原理探索
iOS 底层原理 文章汇总本文的主要目的是针对类的加载的一个扩展,主要讲讲类拓展和分类的底层实现原理【面试题】类扩展 与 分类 的区别1、category 类别、分类专门用来给类添加新的方法不能给类添加成员属性,添加了成员属性,也无法取到注意:其实可以通过runtime 给分类添加属性,即属性关联,重写setter、getter方法分类中用@property 定义变量,只会生成变量的setter、getter方法的声明,不能生成方法实现 和 带下划线的成员变量2、ex.原创 2020-10-24 20:16:21 · 511 阅读 · 0 评论 -
iOS-底层原理 18:类的加载(下)
iOS 底层原理 文章汇总在上一篇文章iOS-底层原理 17:类的加载(上)中,理解了类是如何从Mach-O加载到内存中,这次我们来解释下分类是如何加载到类中的,以及分类和类搭配使用的情况分类的本质前提:在main中定义LGperson的分类LG探索分类的本质,有以下三种方式【方式一】通过clang【方式二】通过Xcode文档搜索Category【方式三】通过objc源码搜索 category_t方式一:通过clang【方式一】clang -rewrite-objc main.原创 2020-10-20 17:53:26 · 666 阅读 · 0 评论 -
iOS-底层原理 17:类的加载(上)
iOS 底层原理 文章汇总在上一篇iOS-底层原理 16:dyld与objc的关联文章中,我们理解了dyld与objc是如何关联的,本文的主要目的是理解类的相关信息是如何加载到内存的,其中重点关注map_images和load_imagesmap_images:主要是管理文件中和动态库中的所有符号,即class、protocol、selector、category等load_images:加载执行load方法其中代码通过编译,读取到Mach-O可执行文件中,再从Mach-O中读取到内.原创 2020-10-20 17:50:31 · 1212 阅读 · 1 评论 -
iOS-底层原理 16:dyld与objc的关联
iOS 底层原理 文章汇总本文的主要目的是理解dyld与objc是如何关联的在上一篇文章iOS-底层原理 15:dyld加载流程中,我们梳理了dyld的加载流程,下面来详细介绍下dyld和objc的关联_objc_init 源码解析首先,来看下libObjc中的_objc_init方法源码void _objc_init(void){ static bool initialized = false; if (initialized) return; initializ.原创 2020-10-14 16:44:33 · 545 阅读 · 0 评论 -
iOS-底层原理 15:dyld加载流程
iOS 底层原理 文章汇总本文的目的主要是分析dyld的加载流程,了解在main函数之前,底层还做了什么引子创建一个project,在ViewController中重写了load方法,在main中加了一个C++方法,即kcFUnc,请问它们的打印先后顺序是什么?运行程序,查看 load、kcFunc、main的打印顺序,下面是打印结果,通过结果可以看出其顺序是 load --> C++方法 --> main为什么是这么一个顺序?按照常规的思维理解,main不是入口函.原创 2020-09-27 23:08:34 · 1252 阅读 · 0 评论 -
iOS-底层原理 14:objc_msgSend流程分析之 动态方法决议 & 消息转发
iOS 底层原理 文章汇总引子在前面两篇文章iOS-底层原理 12:objc_msgSend流程分析之快速查找和iOS-底层原理 13:objc_msgSend流程分析之慢速查找中,分别分析了objc_msgSend的快速查找和慢速查找,在这两种都没找到方法实现的情况下,苹果给了两个建议动态方法决议:慢速查找流程未找到后,会执行一次动态方法决议消息转发:如果动态方法决议仍然没有找到实现,则进行消息转发如果这两个建议都没有做任何操作,就会报我们日常开发中常见的方法未实现的崩溃报错,其步骤如下.原创 2020-09-25 15:04:27 · 576 阅读 · 0 评论 -
iOS-底层原理 13:objc_msgSend流程分析之慢速查找
iOS 底层原理 文章汇总在上一篇iOS-底层原理 12:objc_msgSend流程分析之快速查找文章中,我们分析了快速查找流程,如果快速查不到,则需要进入慢速查找流程,以下是慢速查找的分析过程objc_msgSend 慢速查找流程分析慢速查找-汇编部分在快速查找流程中,如果没有找到方法实现,无论是走到CheckMiss还是JumpMiss,最终都会走到__objc_msgSend_uncached汇编函数在objc-msg-arm64.s文件中查找__objc_msgSend_uncac.原创 2020-09-23 01:38:39 · 419 阅读 · 0 评论 -
iOS-底层原理 12:objc_msgSend流程分析之快速查找
iOS 底层原理 文章汇总本文的主要目的是理解objc_msgSend的方法查找流程在上一篇文章iOS-底层原理 11:objc_class 中 cache 原理分析中,分析了cache的写入流程,在写入流程之前,还有一个cache读取流程,即objc_msgSend 和 cache_getImp在分析之前,首先了解什么是RuntimeRuntime 介绍runtime称为运行时,它区别于编译时运行时 是代码跑起来,被装载到内存中的过程,如果此时出错,则程序会崩溃,是一个动态阶段编.原创 2020-09-22 09:57:27 · 743 阅读 · 0 评论 -
iOS-底层原理 10:strong©&weak底层分析 以及 方法签名和attribute简写含义
iOS 底层原理 文章汇总在clang编译的cpp文件中可以发现 strong & copy & weak 修饰的属性在编译的底层代码中是有区别的strong & copy & weak 底层分析在LGPerson中我们定义了两个两个属性,分别用copy和strong修饰用clang将main.m文件编译成main.cpp,然后发现copy 和strong修饰的属性的set方法是有区别的这里就有疑问了,为什么copy修饰的属性使用了objc_se.原创 2020-09-19 10:23:25 · 780 阅读 · 0 评论 -
iOS-底层原理 11:objc_class 中 cache 原理分析
iOS 底层原理 文章汇总本文的主要目的是理解cache_t以及sel-imp的缓存原理整体分析在之前的iOS-底层原理 07:isa与类关联的原理和iOS-底层原理 08:类 & 类结构分析中,分析了objc_class中isa和bits,这次主要是分析objc_calss中的cache属性cache中存储的是什么?首先,我们需要知道cache中存储的到底是什么?查看cache_t的源码,发现分成了3个架构的处理,其中真机的架构中,mask和bucket是写在一起,目的是为了优化.原创 2020-09-18 11:40:03 · 537 阅读 · 0 评论 -
iOS-底层原理 09:类 & isa 经典面试题分析
iOS 底层原理 文章汇总本文的面试题主要涉及isa走位 & 继承关系 & 类结构 相关的面试题以及针对面试题的分析【面试题】类存在几份?由于类的信息在内存中永远只存在一份,所以 类对象只有一份【百度面试题】objc_object 与 对象的关系所有的对象 都是以 objc_object为模板继承过来的所有的对象 是 来自 NSObject(OC) ,但是真正到底层的 是一个objc_object(C/C++)的结构体类型【总结】 objc_object 与 对.原创 2020-09-15 16:25:17 · 426 阅读 · 0 评论 -
iOS-底层原理 08:类 & 类结构分析
iOS 底层原理 文章汇总本文的主要目的是分析 类 & 类的结构,整篇都是围绕一个类展开的一些探索类 的分析类的分析 主要是分析 isa的走向 以及 继承关系准备工作定义两个类继承自NSObject的类CJLPerson,@interface CJLPerson : NSObject{ NSString *hobby;}@property (nonatomic, copy) NSString *cjl_name;- (void)sayHello;+ (void.原创 2020-09-13 01:30:49 · 495 阅读 · 1 评论 -
iOS-底层原理 07:isa与类关联的原理
本文的主要目的是理解类与isa是如何关联的在介绍正文之前,首先需要理解一个概念:OC对象的本质是什么?OC对象本质在探索oc对象本质前,先了解一个编译器:clangClangclang是一个由Apple主导编写,基于LLVM的C/C++/OC的编译器主要是用于底层编译,将一些文件``输出成c++文件,例如main.m 输出成main.cpp,其目的是为了更好的观察底层的一些结构 及 实现的逻辑,方便理解底层原理。探索对象本质在main中自定义一个类LGPerson,有一个属性n原创 2020-09-10 23:06:28 · 658 阅读 · 1 评论 -
iOS-底层原理 06:malloc 源码分析 思路
在iOS-底层原理 02:alloc & init & new 源码分析文章中,alloc有3个核心操作,其中一个就是calloc,即申请内存,这就是今天需要探索的内容,其实探索的本质也是为了验证 ios中对象中实际的对齐方式是8字节对齐objc4中分析calloc 源码首先从alloc进入objc的源码,找到obj = (id)calloc(1, size);操作,涉及的方法顺序是alloc --> _objc_rootAlloc --> callAlloc -->原创 2020-09-09 17:24:11 · 750 阅读 · 0 评论 -
iOS-底层原理 04:NSObject的alloc 源码分析
iOS 底层原理 文章汇总主要NSObject中的alloc是与自定义类的alloc的源码流程的区别,以及为什么NSObject中的alloc不走源码工程。在上一篇文章中分析了alloc的源码,这篇文章是作为对上一篇文章的补充,去探索为什么NSObject的alloc方法不走源码工程。NSObject的alloc无法进入源码的问题首先在objc4-781可编译源码中的main函数中增加一个NSObject定义的对象,NSObject 和 LGPersong同时加上断点在alloc的源码实原创 2020-09-09 02:08:17 · 481 阅读 · 0 评论 -
iOS-底层原理 05:内存对齐原理
在探讨内存对齐原理之前,首先介绍下iOS中获取内存大小的三种方式获取内存大小的三种方式获取内存大小的三种方式分别是:sizeofclass_getInstanceSizemalloc_sizesizeof1、sizeof是一个操作符,不是函数2、我们一般用sizeof计算内存大小时,传入的主要对象是数据类型,这个在编译器的编译阶段(即编译时)就会确定大小而不是在运行时确定。3、sizeof最终得到的结果是该数据类型占用空间的大小class_getInstanceSize这个方法原创 2020-09-08 19:26:18 · 710 阅读 · 1 评论 -
iOS 底层原理 文章汇总
objc4 源码相关iOS-底层原理 01:源码探索的三种方式iOS-底层原理 02:alloc & init & new 源码分析iOS-底层原理 03:objc4-781 源码编译 & 调试原创 2020-09-07 09:45:55 · 1550 阅读 · 0 评论 -
iOS 底层原理03:objc4-781 源码编译 & 调试
iOS-底层原理 01:源码探索的三种方式iOS-底层原理 02:alloc & init & new 源码分析iOS 底层原理03:objc4-781 源码编译 & 调试本文主要是通过将objc4-781的源码编译成功,然后在源码中进行调试,便于跟踪方法的底层实现流程准备工作环境版本 & 最新objc源码mac OS 10.15Xcode 11.4objc4-781依赖文件下载需要下载以下依赖文件其中除了其中 launchd-106.10 .原创 2020-09-06 20:18:00 · 1830 阅读 · 5 评论 -
iOS-底层原理 02:alloc & init & new 源码分析
iOS-底层原理 01:源码探索的三种方式iOS-底层原理 02:alloc & init & new 源码分析在分析alloc源码之前,先来看看一下3个变量 指针 和 内存地址 区别:分别输出3个对象的内容、指针地址、对象地址,下图是打印结果结论:通过上图可以看出,3个对象指向的是同一个内存空间,所以其内容 和 指针地址是相同的,但是对象的内存地址是不同的%p -> &p1:一个是内存地址,%p -> p1: 一个是指向内存地址的指针这就是本文.原创 2020-09-06 04:12:25 · 859 阅读 · 1 评论 -
iOS-底层原理 01:源码探索的三种方式
iOS-底层原理 01:源码探索的三种方式本文主要介绍下源码探索的三种方法1、符号断点直接跟流程2、通过按住control+step into3、汇编跟流程下面详细讲下这三种方法是如何查找到函数所在的源码库,以alloc为例1、符号断点直接跟流程通过下alloc的符号断点选择断点Symbolic Breakpoint符号断点中输入 allocmain中的CJLPerson处 加一个断点在走到这部分断点之前,需要关闭上面新增的符号断点,原因是因为allo.原创 2020-09-05 22:45:58 · 611 阅读 · 1 评论