LML Blog

Thinking will not overcome fear but action will.

探索 iOS 内存分配

前言 本系列为 iOS Memory 相关内容作为主题的第三篇。前两篇围绕 ARC/MRC、循环引用的原理、Block 内存管理展开,这些内容更准确的说应该是 ObjC 的内存管理,是语言层面带来的特性。而这篇文章主要介绍系统层次的内存管理,主要解决下面几个问题: 一般操作系统如果管理内存的? 虚拟内存的使用 iOS 系统如何管理内存的? ...

OC 内存管理

前言 本系列为 iOS Memory 相关内容作为主题的第一篇。主要围绕引用计数、ARC/MRC展开。 内存管理基础——引用计数 OC 中 class 实质是什么? 首先要区分两个概念 Class @interface BDViewController : UIViewController @property(nonatomic,copy) NSString *name; @p...

Block

前言 本系列是 iOS Memory 相关内容作为主题的第二篇。本篇主要介绍 Block 内存原理、循环引用的原理。在看本文之前,可以先思考一下一个问题,然后在文中找到答案。 如何定义一个 Block? Blcok 到底是什么? Block 有几种类型,有什么区别 __block 修饰符的原理以及作用 Block 捕获不同类型的变量的原理 Block 为什么会造...

OC/C与C++混编找不到符号问题

前言 在OC(C)与C++混合编程的时候,会遇到找不到符合的问题。本文从原理上进行详细分析 .mm、.cpp、.m(.c)文件区别 .mm 文件可以进行OC(C)与C++de混合编写,可以二者的哭都可以import,但是需要注意的上,非OC方法会按照C++的编译连接规范进行编译连接,产生相应的符号 .cpp 文件只可以编写C++代码,因此对于非类的方法会按照C++的编译连接规范进...

MMKV与NSUserDefaults

本文文章需要解决的问题 MMKV MMKV 的set get default的原理总结 其实基本是内存文件都保存了一份,内存是个dic,文件是mmap,文件不足的时候需要重排列,扩大文件,并重新mmap(这里是异步还是同步需要了解,因为肯能会造成性能瓶颈—— 每次第一次使用:mmap+初始化dic,这个比...

OC与C++的atomic问题

前言 最近用OC、C++混编的形式实现了一个库,对性能要求较高的地方用了C++实现。编码过程中遇到一个问题,基础类型变量的线程安全问题。为了保证性能,采用了std::atomic 来保证了线程安全。由此引发了几个思考:基础变量的写和读操作不是原子性的吗?为啥要加锁?为什么 std::atomic 的性能比GCD锁性能高?std::atomic 类型的变量的操作都涉及的内存顺序是什么?为啥会...

文件mmap读写和普通读写

前言 本文主要介绍文件读写的相关问题: 虚拟文件系统 mmap读写文件 普通读写文件机制 分析上述两种方案的原理、区别、各自的优势 用户空间(user space)和内核空间(kernel space) 进程的虚拟地址空间可分为两部分,内核空间和用户空间。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们...

Instruments 使用与原理

前言 Instruments 能够帮助我们分析一些问题,比如 xcode 对image的加载过程,什么时候解码,什么时候IO等的分析(这里详细介绍)。本文主要介绍 Instruments 的使用,以及原理 Instruments 内存相关 从苹果的开发者文档里可以看到,一个 app 的内存分三类:其中 Leaked memory 和 Abandoned memory 是需要我们分析注意的...

前言 线程、队列、锁 与 Runloop 是iOS 中比较重要且相关联的概念。本文为此系列的第二篇,主要介绍与锁相关的知识,队列与线程相关知识件上篇;RunLoop 相关知识见下篇。 下面这张图大家应该很熟悉,本文主要按照这个顺序介绍几种常见的锁如何使用,锁的底层原理,为什么性能会不相同,后续有时间介绍 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安...

运行时

运行时相关库源码解析

前言 线程、队列、锁 与 Runloop iOS 中比较重要且相关联的概念。本文为此系列的第一篇,主要介绍与线程、队列相关几组概念和这几组概念之间的关系。下面为本篇介绍的提纲: 队列、任务 同步、异步 串行队列、并行队列 线程与队列的组合 线程与队列的关系 死锁 #1.任务、队列 任务:执行什么操作,比如block 队列:用来存放任务 - Th...