- 博客(217)
- 资源 (4)
- 收藏
- 关注
原创 iOS 底层原理 文章汇总
objc4 源码相关iOS-底层原理 01:源码探索的三种方式iOS-底层原理 02:alloc & init & new 源码分析iOS-底层原理 03:objc4-781 源码编译 & 调试
2020-09-07 09:45:55 1608
原创 OpenGL + OpenGL ES +Metal 系列文章汇总
OpenGL 文章汇总基础知识一、了解 OpenGL 常见专有名词二、屏幕卡顿 及 iOS中的渲染流程解析三、OpenGL 渲染架构分析四、深入剖析【离屏渲染】原理五、OpenGL 渲染技巧:正背面剔除六、OpenGL 渲染技巧:深度测试、多边形偏移、 混合七、OpenGL中观察方式与矩阵的关系八、了解OpenGL中的向量、矩阵九、OpenGL 基础变化与矩阵堆栈十、OpenGL 纹理相关API十一、理解纹理坐标OpenGL案例案例 01、OpenGL入门–绘制三角形案
2020-08-14 10:33:17 1819
原创 iOS-底层原理 25:多线程原理
iOS 底层原理 文章汇总本文的目的在于了解进程、线程、多线程、线程池等的基本概念及原理线程 和 进程线程和进程的定义线程线程时进程的基本执行单元,一个进程的所有任务都在线程中执行进程要想执行任务,必须的有线程,进程至少要有一条线程程序启动会默认开启一条线程,这条线程被称为 主线程 或者 UI线程进程进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内通过“活动监视器”可以查看mac系统中所开启的线程所以,可以简单的理解.
2020-11-24 16:28:44 1101 1
原创 iOS-底层原理 24:内存五大区
iOS 底层原理 文章汇总在iOS中,内存主要分为栈区、堆区、全局区、常量区、代码区五大区域。如下图所示下面分别介绍这五大区栈区(Stack)定义栈是系统数据结构,其对应的进程或者线程是唯一的栈是向低地址扩展的数据结构栈是一块连续的内存区域,遵循先进后出(FILO)原则栈的地址空间在iOS中是以0X7开头栈区一般在运行时分配存储栈区是由编译器自动分配并释放的,主要用来存储局部变量函数的参数,例如函数的隐藏参数(id self,SEL _cmd).
2020-11-24 16:27:03 867 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 931
原创 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 781 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 1394
原创 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 725
原创 iOS-底层原理 19:类扩展 与 关联对象 底层原理探索
iOS 底层原理 文章汇总本文的主要目的是针对类的加载的一个扩展,主要讲讲类拓展和分类的底层实现原理【面试题】类扩展 与 分类 的区别1、category 类别、分类专门用来给类添加新的方法不能给类添加成员属性,添加了成员属性,也无法取到注意:其实可以通过runtime 给分类添加属性,即属性关联,重写setter、getter方法分类中用@property 定义变量,只会生成变量的setter、getter方法的声明,不能生成方法实现 和 带下划线的成员变量2、ex.
2020-10-24 20:16:21 533
原创 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 692
原创 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 1269 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 593
原创 五、GLSL 常用内建函数
OpenGL + OpenGL ES +Metal 系列文章汇总常用函数常用函数说明genType abs (genType x)返回x的绝对值genType sign (genType x)如果x>0,返回1.0;如果x=0,返回0,如果x<0,返回-1.0genType floor (genType x)返回小于等于x的最大整数值genType ceil (genType x)返回大于等于x的最小整数值genType fract (.
2020-10-02 13:35:17 627
原创 swift 音频被中断处理
1、监听音频打断事件NotificationCenter.default.addObserver(self, selector: #selector(audioStart(_:)), name: NSNotification.Name.AVAudioSessionInterruption, object: nil)2、在通知方法中处理音频中断事件AVAudioSessionInterruptionType有两种类型:began 和 endedpublic enum Interruptio.
2020-09-28 16:52:13 852
原创 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 1308
原创 iOS-底层原理 14:objc_msgSend流程分析之 动态方法决议 & 消息转发
iOS 底层原理 文章汇总引子在前面两篇文章iOS-底层原理 12:objc_msgSend流程分析之快速查找和iOS-底层原理 13:objc_msgSend流程分析之慢速查找中,分别分析了objc_msgSend的快速查找和慢速查找,在这两种都没找到方法实现的情况下,苹果给了两个建议动态方法决议:慢速查找流程未找到后,会执行一次动态方法决议消息转发:如果动态方法决议仍然没有找到实现,则进行消息转发如果这两个建议都没有做任何操作,就会报我们日常开发中常见的方法未实现的崩溃报错,其步骤如下.
2020-09-25 15:04:27 598
原创 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 443
原创 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 772
原创 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 823
原创 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 564
原创 数据结构与算法 01:基础名词解释 & 基本概念
基础名词解释数据:程序的操作对象,用于描述客观事物,有以下两个特点可以输入到计算机可以被计算机处理数据元素:组成数据对象的基本单元数据项:一个数据元素由若干数据项组成数据对象:性质相同的数据元素的集合,类似于数组以上4种名词之间的关系如下图所示:结构:数据元素之间不是独立的,存在特定的关系,这些关系即是结构数据结构:指的是相互之间存在一种或多种特定关系的数据元素的集合算法:对特定问题求解步骤的一种描述程序设计 = 数据结构 + 算法
2020-09-15 22:01:45 1365
原创 iOS-底层原理 09:类 & isa 经典面试题分析
iOS 底层原理 文章汇总本文的面试题主要涉及isa走位 & 继承关系 & 类结构 相关的面试题以及针对面试题的分析【面试题】类存在几份?由于类的信息在内存中永远只存在一份,所以 类对象只有一份【百度面试题】objc_object 与 对象的关系所有的对象 都是以 objc_object为模板继承过来的所有的对象 是 来自 NSObject(OC) ,但是真正到底层的 是一个objc_object(C/C++)的结构体类型【总结】 objc_object 与 对.
2020-09-15 16:25:17 462
原创 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 527 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 697 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 785
原创 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 509
原创 iOS-底层原理 05:内存对齐原理
在探讨内存对齐原理之前,首先介绍下iOS中获取内存大小的三种方式获取内存大小的三种方式获取内存大小的三种方式分别是:sizeofclass_getInstanceSizemalloc_sizesizeof1、sizeof是一个操作符,不是函数2、我们一般用sizeof计算内存大小时,传入的主要对象是数据类型,这个在编译器的编译阶段(即编译时)就会确定大小而不是在运行时确定。3、sizeof最终得到的结果是该数据类型占用空间的大小class_getInstanceSize这个方法
2020-09-08 19:26:18 755 1
原创 iOS/Swift Rumtime API
Objective-C RuntimeObjective-C runtime是一个运行库,它提供对Objective-C语言的动态属性的支持,因此所有Objective-C应用程序都链接到它。Objective-C运行库支持函数在位于/usr/lib/libobjc.A.dylib的共享库中实现。在Objective-C中编程时,通常不需要直接使用Objective-C运行时库。此API主要用于开发Objective-C和其他语言之间的桥接层,或用于低级调试。Objective-C运行库的macO.
2020-09-07 09:48:59 234
原创 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 1882 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 893 1
原创 iOS-底层原理 01:源码探索的三种方式
iOS-底层原理 01:源码探索的三种方式本文主要介绍下源码探索的三种方法1、符号断点直接跟流程2、通过按住control+step into3、汇编跟流程下面详细讲下这三种方法是如何查找到函数所在的源码库,以alloc为例1、符号断点直接跟流程通过下alloc的符号断点选择断点Symbolic Breakpoint符号断点中输入 allocmain中的CJLPerson处 加一个断点在走到这部分断点之前,需要关闭上面新增的符号断点,原因是因为allo.
2020-09-05 22:45:58 653 1
原创 [OC RunLoop_翻译]五、配置运行循环源
[OC RunLoop_翻译]一、介绍 & 二、剖析运行循环[OC RunLoop_翻译]三、 什么时候使用运行循环 & 四、使用运行循环对象[OC RunLoop_翻译]五、配置运行循环源注: _Run Loops _链接下面的部分展示了如何在Cocoa和corefoundation中设置不同类型的输入源的示例5-1、定义自定义输入源创建自定义输入源需要定义以下内容:希望输入源处理的信息.调度程序,让感兴趣的客户知道如何联系您的输入源.处理程序,用于执行任何客户端发.
2020-09-05 00:42:15 325
原创 [OC RunLoop_翻译]三、 什么时候使用运行循环 & 四、使用运行循环对象
三、 什么时候使用运行循环?唯一需要显式运行runloop的时间是为应用程序创建辅助线程时。应用程序主线程的运行循环是基础架构的重要组成部分。因此,应用程序框架提供运行主应用程序循环的代码,并自动启动该循环。iOS中 UIApplication(或osx中的 NSApplication)的run方法作为正常启动序列的一部分启动应用程序的主循环。如果您使用Xcode模板项目来创建应用程序,则永远不必显式调用这些例程。对于辅助线程,您需要确定是否需要运行循环,如果需要,请自行配置并启动它。您不需要在所有情况
2020-09-05 00:06:23 307
原创 [OC RunLoop_翻译]一、介绍 & 二、剖析运行循环
注: _Run Loops _链接一、介绍运行循环是与线程相关联的基本基础结构的一部分。运行循环是事件处理循环,可用于安排工作并协调收到的事件的接收。运行循环的目的是在有工作要做时让线程忙,而在没有工作时让线程进入睡眠状态。运行循环管理不是完全自动的。您仍然必须设计线程的代码以在适当的时候启动运行循环并响应传入的事件。 Cocoa和Core Foundation均提供运行循环对象,以帮助您配置和管理线程的运行循环。您的应用程序不需要显式创建这些对象。每个线程(包括应用程序的主线程)都有一个关联的运行循
2020-09-04 23:46:07 321
原创 [OC Runtime编程指南_翻译]八、声明属性
当编译器遇到属性声明(请参阅 _Objective-C _编程语言中 声明属性)时,它会生成与封闭类、类别或协议相关联的描述性元数据。您可以使用支持在类或协议上按名称查找属性、以**@encode**字符串形式获取属性类型以及以C字符串数组形式复制属性属性列表的函数来访问此元数据。声明的属性列表可用于每个类和协议。属性类型和功能Property结构定义属性描述符的不透明句柄。typedef struct objc_property *Property;可以使用函数class_copyPropert
2020-09-03 23:33:13 282
原创 [OC Runtime编程指南_翻译]七、类型编码
为了帮助运行时系统,编译器将每个方法的返回和参数类型编码为字符串,并将字符串与方法选择器相关联。它使用的编码方案在其他上下文中也很有用,因此可以通过**@encode()编译器指令公开使用。当给定类型规范时,@encode()**返回对该类型进行编码的字符串。类型可以是基本类型,如int、指针、带标记的结构或联合,也可以是任何类型的类名,事实上,任何类型都可以用作C sizeof()运算符的参数。char *buf1 = @encode(int **);char *buf2 = @encode(str
2020-09-03 23:32:19 284
原创 [OC Runtime编程指南_翻译]六、消息转发
向不处理该消息的对象发送消息是错误的。但是,在宣布错误之前,运行时系统会给接收对象第二次处理消息的机会。转发如果将消息发送到不处理该消息的对象,则在宣布错误之前,运行时会向该对象发送一个forwardInvocation:message,其中NSInvocation对象作为其唯一参数,NSInvocation对象将封装原始消息及其传递的参数。您可以实现f**orwardInvocation:**方法来给消息提供默认响应,或者以其他方式避免错误。顾名思义,**forwardInvocation:**通常
2020-09-03 23:31:30 311
原创 [OC Runtime编程指南_翻译]五、动态方法解析
本章描述如何动态地提供方法的实现。动态方法解析在某些情况下,您可能希望动态地提供方法的实现。例如,Objective-C声明属性特性(请参阅 _Objective-C _编程语言中的 声明属性)包括@dynamic指令:@dynamic propertyName;它告诉编译器将动态提供与属性关联的方法。可以实现 resolveInstanceMethod:和 resolveClassMethod: 方法,分别为实例和类方法的给定选择器动态提供实现。Objective-C方法只是一个C函数,它
2020-09-03 23:30:31 303
原创 [OC Runtime编程指南_翻译]四、消息传递
本章介绍如何将消息表达式转换为objc_msgSend函数调用,以及如何按名称引用方法。然后解释如何利用objc_msgSend,以及如果需要,如何绕过动态绑定。objc_msgSend 函数在Objective-C中,消息直到运行时才绑定到方法实现。编译器转换消息表达式,[receiver message]调用消息传递函数 objc_msgSend。此函数将接收方和消息中提到的方法的名称(即方法选择器)作为其两个主要参数:objc_msgSend(receiver, selector)消息
2020-09-03 23:29:28 286
Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法.rtf
2020-05-14
swift 版本Callkit放骚扰标记demo
2019-01-09
swift 实现导航栏随tableView滑动颜色渐变、头部图片往上移动效果和往下放大效果
2019-01-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人