iOS - OC底层原理深入
从源码和汇编角度窥探iOS的底层核心原理
RUNNING-NIUER
这个作者很懒,什么都没留下…
展开
-
OC对象的本质(上):OC对象的底层实现原理
一个NSObject对象占用多少内存?######Objective-C的本质平时我们编写的OC代码,底层实现都是C/C++代码Objective-C --> C/C++ --> 汇编语言 --> 机器码所以Objective-C的面向对象都是基于C/C++的数据结构实现的,所以我们可以将Objective-C代码转换成C/C++代码,来研究OC对象的本质。in...原创 2019-03-09 13:42:37 · 698 阅读 · 0 评论 -
Runtime笔记(三)—— OC Class的方法缓存cache_t
☕️☕️本文篇幅比较长,创作的目的并不是为了在简书上刷赞和阅读量,而是为了自己日后温习知识所用。如果有幸被你发现这篇文章,并且引起了你的阅读兴趣,请休息充分,静下心来,精力充足地开始阅读,希望这篇文章能对你有所帮助。如发现任何有误之处,肯请留言纠正,谢谢。☕️☕️承接上一篇的内容,我们回过头去看Class的定义struct objc_class : objc_object { //...原创 2019-08-30 14:16:33 · 801 阅读 · 1 评论 -
Runtime笔记(四)—— 刨根问底消息机制
上一篇里面,我们从Class的cache_t作为切入点,完善了我们对于OC类对象的认识,而且还详细了解了Runtime的消息发送流程和方法缓存策略,不过对于消息机制这个话题只是热身而已。接下来,本文就从源头开始,完整地来研究Runtime的消息机制。消息机制流程框架[obj message] ➡️ 消息发送 ➡️ 动态方法解析 ➡️ 消息转发(一)...原创 2019-08-30 14:20:03 · 450 阅读 · 0 评论 -
Runtime笔记(五)—— super的本质
从面试题出发请看如下代码****************************CLPerson.h@interface CLPerson : NSObject@end****************************CLStudent.h@interface CLStudent : CLPerson@end****************************CL...原创 2019-08-30 14:28:58 · 418 阅读 · 0 评论 -
Runtime笔记(八)—— 记一道变态的runtime面试题
先上面试题//***********♦️♦️CLPerson.h♦️♦️************#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface CLPerson : NSObject@property (nonatomic, copy) NSString *name;-(void)p...原创 2019-08-30 14:34:34 · 651 阅读 · 1 评论 -
iOS性能优化
(一)卡顿优化【了解CPU和GPU】在屏幕成像过程中,CPU和GPU的作用是至关重要的。CPU - Central Processing Unit,中央处理器,在iOS程序中,负责对象的创建和销毁、对象属性的调整、布局的计算、文本的计算和排版规格、图片的格式转码和解码、图像的绘制(Core Graphic)GPU - Graphics Processing Unit,图形处理器,负责纹理...原创 2019-08-30 15:15:06 · 312 阅读 · 0 评论 -
Block笔记(1)—— 基本认识
block是什么通俗的理解:block就是将一些代码封装起来,以便在将来某个时候被使用,如果你不去调用block,block内部封装的代码就不会执行。举一个简单的例子,下面在main函数中定义一个最简单的blockint main(int argc, const char * argv[]) { @autoreleasepool { ^{ NSL...原创 2019-08-30 21:18:00 · 515 阅读 · 0 评论 -
Block笔记(2)—— 底层结构
上一篇,我们初步认识了Block的一些基本知识。现在,我们来一起挖掘一下Block的底层结构。首先还是新建一个命令行项目定义一个最最简单的block#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { ...原创 2019-08-30 21:34:19 · 217 阅读 · 0 评论 -
Block笔记(3)—— 基础类型的变量捕获
上一章节里面,我们分析了一下胚胎版的Block的底层结构。现在我们加点料进去#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { //Block的定义 void (^block)(int, int) = ^(i...原创 2019-09-02 09:13:36 · 322 阅读 · 0 评论 -
Block笔记(4)—— Block的类型
前面的章节里面,我们了解到Block也是一个OC对象,因为它的底层结构中也有isa指针。例如下面这个block:#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { //Block的定义 vo...原创 2019-09-02 13:17:45 · 388 阅读 · 0 评论 -
内存管理—weak的实现原理
a原创 2019-09-02 21:21:09 · 533 阅读 · 0 评论 -
Block笔记(5)—— 对象类型的auto变量捕获
啊原创 2019-09-04 17:40:03 · 317 阅读 · 0 评论 -
Runtime笔记(二)—— Class结构的深入分析
我在OC对象的本质(下)—— 详解isa&superclass指针中,有介绍过Class对象的内存结构,如下图本文就以此为起点,来仔细挖掘一下Class内部都有哪些宝贝。(一)Class的结构简述首先我们来看一下objc源码对Class的定义struct objc_class : objc_object { // Class ISA; Class supercla...原创 2019-08-30 14:09:38 · 989 阅读 · 0 评论 -
Runtime笔记(一)—— isa的深入体会(苹果对isa的优化)
☕️☕️本文篇幅比较长,创作的目的并不是为了在简书上刷赞和阅读量,而是为了自己日后温习知识所用。如果有幸被你发现这篇文章,并且引起了你的阅读兴趣,请休息充分,静下心来,精力充足地开始阅读,希望这篇文章能对你有所帮助。如发现任何有误之处,肯请留言纠正,谢谢。☕️☕️如何理解Objective-C的动态特性?很多静态编程语言,编写完代码后,经过编译连接生成可执行文件,最后就可以在电脑上运行起来...原创 2019-08-30 14:06:00 · 1352 阅读 · 0 评论 -
KVO的底层原理
提示:阅读本文需要对isa和superclass指针非常熟悉,如果你还不是很清楚的话,可以参考我的isa和superclass的总结.什么是KVO?KVO全称是Key-Value Observing,俗称“键值监听”,可用于监听某个对象属性值的改变。KVO的本质分析先看如下代码#import "ViewController.h"#import "CLPerson.h"@inter...原创 2019-08-30 13:42:56 · 326 阅读 · 0 评论 -
如何保证iOS的多线程安全
什么会给多线程的安全造成隐患?有了多线程技术支持,我们可以并发的进行多个任务,因此同一块资源就有可能在多个线程中同时被访问(读/写)。这个现象叫作资源共享,比如多个线程同时访问了同一个对象,同一个变量或同一个文件,这样就有可能引发数据错乱何数据安全问题。经典问题一——存钱取钱下面通过代码展示一下该问题- (void)touchesBegan:(NSSet<UITouch *> *...原创 2019-08-30 11:28:48 · 1411 阅读 · 1 评论 -
OC对象的本质(中):OC对象的分类
OC对象的本质(上):OC对象的底层实现原理OC对象的本质(中):OC对象的种类OC对象的本质(下):详解isa&superclass指针Objective-C中的对象,简称OC对象,主要分3类instance对象(实例对象)class对象(类对象)meta-class对象(元类对象)instance 实例对象instance对象就是通过alloc方法创建出来的对象...原创 2019-08-30 11:40:02 · 306 阅读 · 0 评论 -
OC对象的本质(下)—— 详解isa&superclass指针
OC对象的本质(上):OC对象的底层实现原理OC对象的本质(中):OC对象的种类OC对象的本质(下):详解isa&superclass指针###isa指针先总结一下我们在对象的分类一文里面分析过的问题,OC对象氛围三类instance对象,内部包含成员变量特殊的成员变量isa指针class对象,用来描述instance对象,内部包含isa指针superc...原创 2019-08-30 11:51:31 · 393 阅读 · 0 评论 -
Runloop的内部结构与运行原理
什么是RunloopRunloop顾名思义,就是运行循环。首先它根程序运行过程有关系,其次它是一种转圈圈的效果。但如果这么解释,恐怕谁都听不懂。想要弄明白Runloop,就要搞清楚跟它有关联的一些概念,以及它自身的运作原理。没有Runloop的程序我们通过Xcode新建一个命令行项目,main.m文件里的代码如下#import <Foundation/Foundation.h>...原创 2019-08-30 12:22:27 · 3356 阅读 · 0 评论 -
内存管理——autorelease原理分析
经历过MRC时代的开发者,肯定都用过autorelease方法,用于把对象交给AutoreleasePool管理,在合适的时候,自动释放对象。其实所谓的自动释放对象,就是对所管理的对象调用release方法。要想知道autorelease方法的原理,首先就需要弄清楚AutoreleasePool是个什么东东。下面来看一个段MRC环境下的代码,为什么要在MRC下讨论这个问题呢?因为ARC会为我们在...原创 2019-08-30 12:26:28 · 611 阅读 · 0 评论 -
内存管理——定时器问题
CADisplayLink、NSTimer的循环引用问题CADisplayLink是QuartzCore框架下的的一种定时器,用在跟画图相关的处理当中。NSTimer大家应该很熟悉,是我们最常用的定时器。这两种定时器分别提供如下两个API+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;+ (NSTi...原创 2019-08-30 12:30:17 · 400 阅读 · 0 评论 -
iOS程序的内存布局
iOS程序安装之后,是以Mach-o文件的格式保存在iOS设备里面,当启动程序时,对应的Mach-o文件就会被加载进内存。下面,就来介绍一下iOS程序的内存布局。首先看下图如果你拥有iOS逆向的知识,这个话题对你来说应该如同砍瓜切菜,假如不巧你不懂逆向的话,还有一种方法可以来验证上面的图。看如下测试代码//*********************main.m*****************...原创 2019-08-30 12:31:20 · 707 阅读 · 0 评论 -
内存管理—MRC时代的手动内存管理
MRC时代的手动内存管理iOS中是通过【引用计数】来管理OC对象的内存的。一个新创建的OC对象引用计数默认是1,当引用计数减为0,OC对象就会销毁,其占用的内存空间会被系统释放。调用retain会让OC对象的引用计数+1,调用release会让OC对象的引用计数-1。内存管理的原则当调用alloc、new、copy、mutableCopy方法返回了一个对象,再不需要这个对象时,要调...原创 2019-08-30 12:36:06 · 585 阅读 · 0 评论 -
Objective-C之Category的底层实现原理
Objective-C的+load方法调用原理分析Objective-C的+initialize方法调用原理分析Category的使用场景我个人粗浅理解,就是将一个类的实现,拆解成小的模块,便于管理和维护。因为实际项目中,有些类的功能可能会非常复杂,导致一个类的代码过多,这对后期修改和维护是比较不利的,所以category方便了程序员,可以根据功能,业务等形式的划分,将类的一大堆方法分组放置...原创 2019-08-30 12:43:45 · 403 阅读 · 0 评论 -
Objective-C的+load方法调用原理分析
Objective-C之Category的底层实现原理Objective-C的+initialize方法调用原理分析别人是这么说的调用时机:+load方法会在Runtime加载类对象(class)和分类(category)的时候调用**调用频率:**每个类对象、分类的+load方法,在工程的整个生命周期中只调用一次调用顺序:先调用类对象(class)的+load方法:类对象的l...原创 2019-08-30 12:47:29 · 523 阅读 · 0 评论 -
Objective-C的+initialize方法调用原理分析
Objective-C的+load方法调用原理分析Objective-C之Category的底层实现原理Objective-C为我们提供了两种方法去运行对类进行相关设置的代码。+load:该方法会在很早阶段(同时也是比较危险的阶段,可能导致崩溃)被调用,一旦某个类被Runtime加载,该类的+load方法就会被调用。我们可以在这个方法里面写一些必须要在程序运行非常早期阶段就需要运行的代码。...原创 2019-08-30 12:56:13 · 321 阅读 · 0 评论 -
Block笔记(6)— __block的深入分析
a原创 2019-09-16 22:29:07 · 706 阅读 · 0 评论