类的结构分析 2 - cache_t 本文来探索类结构中 cache_t. 之前的文章 OC 底层探索 04 中,已知如何找到类信息。本文我们对类信息中的 cache_t 进行探索。 objc_class 结构 : 从 OC 底层探索 04 中的指针和内存偏移,我们已知可通过指针平移获取相应位置信息,cache_t 的位置 = 8 + 8 =16 一、cache_t 简析cache_t 的源码分析: CACHE_MASK_STOR 2018-09-22
isa 2 个经典问题分析 isa 2 个经典问题分析 一、类的归属问题1、2 个 API objc_getMetaClass() –> 获取元类 class_getMethodImplementation() –> 获取 IMP 2、实例方法 和 类方法 分析1. 实例方法class_getInstanceMethod() –> 类的实例方法 2. 类方法class_getClassMethod() 2018-09-19
属性、成员、实例变量简析 本文探索属性、成员、实例变量。 一、简介1、属性变量1@property (nonatomic, copy) NSString *propName; @property:做了什么事?文章后面探索。 为 propName 生成了 set/get 方法的声明和实现,同时为其生成了私有的 ivar 成员变量 _propName; 2、成员变量1234@interface MyPerson : NSO 2018-09-17
类的结构分析 & isa & bits 本文内容主要对 isa 指向流程 和 类的结构以及类中 bits 进行探索。 一、类与 isa运行 objc 源码工程,main.m 文件中断点打在 objc2,读取对象 objc2 的内存如下: 图中,我们发现两个不同的 地址,他们的值都是 MyPerson。这是为何呢?–> 元类 我们继续读取内存,如下图: 结合以上内容,我们可以得出 objc2 –> MyPerson –&g 2018-09-14
对象本质 & isa 结构 本文开始探索 OC 对象的本质是什么? 一、对象 对象的本质 - 结构体1、编译后的对象1、我们在 main.m 文件中做简单代码如下: 1234567891011121314151617#import <Foundation/Foundation.h>#import <objc/runtime.h>@interface MyPerson : NSObject@prope 2018-09-12
开辟空间 - 字节对齐 + 内存对齐 一、字节对齐 1、为什么要进行字节对齐处理呢? 性能,快,以空间换取时间。 可以想象 2 个场景,场景 1:当我们的 CPU 去读取内存时,每次读取的大小如果是不确定的 (8、7、3、9… …),那么除非每次读取都要重新改变自己的读取方式否则读取的数据就会读错到其他数据上去。 场景 2,如果我们所存储的对象以固定的大小存储时,8/16,那么读取数据时,只需要按部就班去取 不必反复改变读取方式。 场 2018-09-07
如何探索底层 + alloc 做了什么 本文介绍 如何探索 alloc 和 alloc 做了什么? objc 可编译源码 从最简单的代码开始: 1234567MyPerson *p1 = [MyPerson alloc]; MyPerson *p2 = [p1 init]; MyPerson *p3 = [p1 init]; NSLog(@"%@ - %p - %p",p1,p1,& 2018-09-05
优化APP的显示性能 APP 的显示性能问题一直以来都是一个经久不衰的话题,特别是滚动视图、表视图的滚动流畅性等等问题。那么从我们 new 一个 UIKit 开始到它在屏幕上显示的过程,CPU 和 GPU 以及显示设备是如何协同工作的呢?APP 的显示性能、帧率到底应该从哪些方面入手去优化?还是说忽略理论分析,而强行优化性能?下面我们就来讨论一下这个问题。 一、几个概念1、像素和分辨率像素,通俗的来讲就是构成图像的最小 2018-07-21
runtime管理weak引用的方式 前言提及 weak 引用,大多数人都知道在什么时候要用它,如果不知道的话:ARC内存管理以及循环引用,其实对于手动管理堆内存来说,比如 C 语言,并不存在所谓的强引用和弱引用,ARC 这种自动引用计数管理内存的方式,导致了两个对象循环引用,从而产生内存泄漏。循环引用就像是双向链表的两个结点的 next 指针互相指向,当我们用 C 语言实现循环链表的时候,即使没有 weak,也能很好的管理每个结点的 2018-07-13
多线程编程与 GCD 如果你还不了解进程的话,请参考:并发编程之进程,进程是由完整的逻辑控制流和独立的地址空间构成的,一个线程就是进程中一个单一顺序的逻辑控制流,由进程调度的线程被称为用户级线程,由内核调度的被称为内核线程(轻量级进程),这里仅讨论用户级线程。多个进程可以被操作系统调度而组成多进程程序,同样的,多个线程也可以被进程调度而组成多线程编程,同一进程的多个线程共享该进程的地址空间,也就是整个进程的虚拟内存都是 2018-07-07