自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

RUNNING-NIUER的博客

灵魂奔跑在双轮间,人生藏匿于代码中

  • 博客(33)
  • 收藏
  • 关注

原创 内存管理——autorelease原理分析

经历过MRC时代的开发者,肯定都用过autorelease方法,用于把对象交给AutoreleasePool管理,在合适的时候,自动释放对象。其实所谓的自动释放对象,就是对所管理的对象调用release方法。要想知道autorelease方法的原理,首先就需要弄清楚AutoreleasePool是个什么东东。下面来看一个段MRC环境下的代码,为什么要在MRC下讨论这个问题呢?因为ARC会为我们在...

2019-08-30 12:26:28 602

原创 Runloop的内部结构与运行原理

什么是RunloopRunloop顾名思义,就是运行循环。首先它根程序运行过程有关系,其次它是一种转圈圈的效果。但如果这么解释,恐怕谁都听不懂。想要弄明白Runloop,就要搞清楚跟它有关联的一些概念,以及它自身的运作原理。没有Runloop的程序我们通过Xcode新建一个命令行项目,main.m文件里的代码如下#import <Foundation/Foundation.h&gt...

2019-08-30 12:22:27 3321

原创 如何保证iOS的多线程安全

什么会给多线程的安全造成隐患?有了多线程技术支持,我们可以并发的进行多个任务,因此同一块资源就有可能在多个线程中同时被访问(读/写)。这个现象叫作资源共享,比如多个线程同时访问了同一个对象,同一个变量或同一个文件,这样就有可能引发数据错乱何数据安全问题。经典问题一——存钱取钱下面通过代码展示一下该问题- (void)touchesBegan:(NSSet<UITouch *> *...

2019-08-30 11:28:48 1390 1

原创 Swift底层原理探索--结构体和类

目录结构体结构体的初始化器自定义初始化器窥探初始化器的本质结构体内存结构类类的初始化器结构体与类的本质区别值类型值类型的赋值操作引用类型对象的堆空间申请过程引用类型的赋值操作值类型、引用类型的let嵌套类型枚举、结构体、类都可以定义方法结构体在Swift标准库中,绝大多数公开类型都是结构体,而枚举和类只占很小的一部分比如Bool、Int、Double...

2020-04-13 15:58:35 2153

原创 Swift底层原理探索--可选项

目录可选项(Optional)强制解包(Forced Unwrapping)判断可选项是否包含值绑定可选项(Optional Binding)while循环中使用可选项绑定空合并运算符??(Nil-Coalescing Operator)多个??一起使用??跟if let配合使用if语句实现登录guard语句隐式解包(Implicitly Unwrapped Optional...

2020-04-13 15:41:58 581

原创 Swift底层原理探索----属性 & 方法

目录【返回目录】Swift语言基础----属性属性存储属性计算属性枚举rawValue原理延迟存储属性(Lazy Stored Property)延迟存储属性注意点属性观察器(Property Observer)全局变量、局部变量`inout`的再次研究`inout`的本质总结类型属性(Type Property)类型属性细节单例模式属性Swift中跟实例相关的属性可以分为2大类存储...

2020-04-13 14:04:12 672

原创 Swift底层原理探索--枚举

目录枚举的基本你用法关联值(Associated Values)关联值枚举原始值(Raw Values)隐式原始值(Implicitly Assigned Raw Values)递归枚举(Recursive Enumeration)MemoryLayout思考下面枚举变量的内存布局窥探内存进一步观察下面枚举的内存布局枚举的基本你用法【返回目录】关联值(Associa...

2020-04-13 11:53:50 686

原创 Swift底层原理探索--函数

目录函数的定义隐式返回返回元组:实现多返回值函数文档的注释参数标签默认参数值(Default Parameter Value)可变参数(Variadic Parameter)Swift自带的print函数输入输出参数(In-Out Parameter)函数重载(Function Overload)内联函数@inline函数类型(Function Type)函数类型作为函...

2020-04-13 11:19:44 1133 1

原创 Swift底层原理探索----闭包

目录Swift语言基础----闭包闭包表达式(Closure Expression)闭包表达式的简写尾随闭包示例 - 数组的排序忽略参数闭包(Closure)1.关于闭包的严谨定义2.闭包本质的推断3.通过汇编来窥探闭包的本质- 不存在变量捕获行为的简单情景-发生了变量捕获行为的情景-那么每次调用`getFn`都确实会重新指定一段堆空间给`num`用吗?-每次对变量进行捕获时到底每次分配了多少堆...

2020-04-02 11:06:02 894 3

原创 Block笔记(6)— __block的深入分析

a

2019-09-16 22:29:07 694

原创 Block笔记(5)—— 对象类型的auto变量捕获

2019-09-04 17:40:03 311

原创 内存管理—weak的实现原理

a

2019-09-02 21:21:09 526

原创 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 377

原创 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 314

原创 Block笔记(2)—— 底层结构

上一篇,我们初步认识了Block的一些基本知识。现在,我们来一起挖掘一下Block的底层结构。首先还是新建一个命令行项目定义一个最最简单的block#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { @autoreleasepool { ...

2019-08-30 21:34:19 211

原创 Block笔记(1)—— 基本认识

block是什么通俗的理解:block就是将一些代码封装起来,以便在将来某个时候被使用,如果你不去调用block,block内部封装的代码就不会执行。举一个简单的例子,下面在main函数中定义一个最简单的blockint main(int argc, const char * argv[]) { @autoreleasepool { ^{ NSL...

2019-08-30 21:18:00 506

原创 iOS性能优化

(一)卡顿优化【了解CPU和GPU】在屏幕成像过程中,CPU和GPU的作用是至关重要的。CPU - Central Processing Unit,中央处理器,在iOS程序中,负责对象的创建和销毁、对象属性的调整、布局的计算、文本的计算和排版规格、图片的格式转码和解码、图像的绘制(Core Graphic)GPU - Graphics Processing Unit,图形处理器,负责纹理...

2019-08-30 15:15:06 303

原创 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 642 1

原创 Runtime笔记(五)—— super的本质

从面试题出发请看如下代码****************************CLPerson.h@interface CLPerson : NSObject@end****************************CLStudent.h@interface CLStudent : CLPerson@end****************************CL...

2019-08-30 14:28:58 408

原创 Runtime笔记(四)—— 刨根问底消息机制

上一篇里面,我们从Class的cache_t作为切入点,完善了我们对于OC类对象的认识,而且还详细了解了Runtime的消息发送流程和方法缓存策略,不过对于消息机制这个话题只是热身而已。接下来,本文就从源头开始,完整地来研究Runtime的消息机制。消息机制流程框架[obj message] ➡️ 消息发送 ➡️ 动态方法解析 ➡️ 消息转发(一)...

2019-08-30 14:20:03 440

原创 Runtime笔记(三)—— OC Class的方法缓存cache_t

☕️☕️本文篇幅比较长,创作的目的并不是为了在简书上刷赞和阅读量,而是为了自己日后温习知识所用。如果有幸被你发现这篇文章,并且引起了你的阅读兴趣,请休息充分,静下心来,精力充足地开始阅读,希望这篇文章能对你有所帮助。如发现任何有误之处,肯请留言纠正,谢谢。☕️☕️承接上一篇的内容,我们回过头去看Class的定义struct objc_class : objc_object { //...

2019-08-30 14:16:33 789 1

原创 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 911

原创 Runtime笔记(一)—— isa的深入体会(苹果对isa的优化)

☕️☕️本文篇幅比较长,创作的目的并不是为了在简书上刷赞和阅读量,而是为了自己日后温习知识所用。如果有幸被你发现这篇文章,并且引起了你的阅读兴趣,请休息充分,静下心来,精力充足地开始阅读,希望这篇文章能对你有所帮助。如发现任何有误之处,肯请留言纠正,谢谢。☕️☕️如何理解Objective-C的动态特性?很多静态编程语言,编写完代码后,经过编译连接生成可执行文件,最后就可以在电脑上运行起来...

2019-08-30 14:06:00 1338

原创 KVO的底层原理

提示:阅读本文需要对isa和superclass指针非常熟悉,如果你还不是很清楚的话,可以参考我的isa和superclass的总结.什么是KVO?KVO全称是Key-Value Observing,俗称“键值监听”,可用于监听某个对象属性值的改变。KVO的本质分析先看如下代码#import "ViewController.h"#import "CLPerson.h"@inter...

2019-08-30 13:42:56 316

原创 Objective-C的+initialize方法调用原理分析

Objective-C的+load方法调用原理分析Objective-C之Category的底层实现原理Objective-C为我们提供了两种方法去运行对类进行相关设置的代码。+load:该方法会在很早阶段(同时也是比较危险的阶段,可能导致崩溃)被调用,一旦某个类被Runtime加载,该类的+load方法就会被调用。我们可以在这个方法里面写一些必须要在程序运行非常早期阶段就需要运行的代码。...

2019-08-30 12:56:13 315

原创 Objective-C的+load方法调用原理分析

Objective-C之Category的底层实现原理Objective-C的+initialize方法调用原理分析别人是这么说的调用时机:+load方法会在Runtime加载类对象(class)和分类(category)的时候调用**调用频率:**每个类对象、分类的+load方法,在工程的整个生命周期中只调用一次调用顺序:先调用类对象(class)的+load方法:类对象的l...

2019-08-30 12:47:29 506

原创 Objective-C之Category的底层实现原理

Objective-C的+load方法调用原理分析Objective-C的+initialize方法调用原理分析Category的使用场景我个人粗浅理解,就是将一个类的实现,拆解成小的模块,便于管理和维护。因为实际项目中,有些类的功能可能会非常复杂,导致一个类的代码过多,这对后期修改和维护是比较不利的,所以category方便了程序员,可以根据功能,业务等形式的划分,将类的一大堆方法分组放置...

2019-08-30 12:43:45 392

原创 内存管理—MRC时代的手动内存管理

MRC时代的手动内存管理iOS中是通过【引用计数】来管理OC对象的内存的。一个新创建的OC对象引用计数默认是1,当引用计数减为0,OC对象就会销毁,其占用的内存空间会被系统释放。调用retain会让OC对象的引用计数+1,调用release会让OC对象的引用计数-1。内存管理的原则当调用alloc、new、copy、mutableCopy方法返回了一个对象,再不需要这个对象时,要调...

2019-08-30 12:36:06 552

原创 iOS程序的内存布局

iOS程序安装之后,是以Mach-o文件的格式保存在iOS设备里面,当启动程序时,对应的Mach-o文件就会被加载进内存。下面,就来介绍一下iOS程序的内存布局。首先看下图如果你拥有iOS逆向的知识,这个话题对你来说应该如同砍瓜切菜,假如不巧你不懂逆向的话,还有一种方法可以来验证上面的图。看如下测试代码//*********************main.m*****************...

2019-08-30 12:31:20 698

原创 内存管理——定时器问题

CADisplayLink、NSTimer的循环引用问题CADisplayLink是QuartzCore框架下的的一种定时器,用在跟画图相关的处理当中。NSTimer大家应该很熟悉,是我们最常用的定时器。这两种定时器分别提供如下两个API+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;+ (NSTi...

2019-08-30 12:30:17 392

原创 OC对象的本质(下)—— 详解isa&superclass指针

OC对象的本质(上):OC对象的底层实现原理OC对象的本质(中):OC对象的种类OC对象的本质(下):详解isa&superclass指针###isa指针先总结一下我们在对象的分类一文里面分析过的问题,OC对象氛围三类instance对象,内部包含成员变量特殊的成员变量isa指针class对象,用来描述instance对象,内部包含isa指针superc...

2019-08-30 11:51:31 389

原创 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 297

原创 OC对象的本质(上):OC对象的底层实现原理

一个NSObject对象占用多少内存?######Objective-C的本质平时我们编写的OC代码,底层实现都是C/C++代码Objective-C --&gt; C/C++ --&gt; 汇编语言 --&gt; 机器码所以Objective-C的面向对象都是基于C/C++的数据结构实现的,所以我们可以将Objective-C代码转换成C/C++代码,来研究OC对象的本质。in...

2019-03-09 13:42:37 687

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除