内存管理有如下划分:
image.png内存布局
image.pngstack(栈区):方法调用,向下增长(如图箭头)
heap(堆区):通过alloc等分配的对象, 向上增长(如图箭头)
bss:未初始化的全局变量等
data:已初始化的全局变量等
text:程序代码
内存管理方案
Q:iOS操作系统是怎样对内存进行管理的?
要想回答这个问题,要先从场景上入手。
iOS操作系统针对不同场景,会提供不同的内存管理方案。
A:
*TaggedPointer (如NSNumber等小对象)
*NONPOINTER_ISA (对于64位架构下的应用程序, 在64位架构下,ISA指针本身是占64比特位的,实际上,有32位/40比特位就够用了,剩余比特位实际是浪费的,苹果为了提高内存利用率,在iSA当中剩余的比特位中存储了一些关于内存管理方面的相关的数据内容)
*散列表(复杂的数据结构,其中包括了引用计数表和弱引用表)
NONPOINTER_ISA
arm64架构
0-15位:
*indexed(0/1):
0:代表使用的isa指针只是一个纯的isa指针,它里面的内容就直接代表了当前对象的类对象的地址。
1:代表使用的isa指针存储的不仅是类对象的地址,而且还有一些内存管理方面的数据。
*has_assoc(是否有关联对象,0/1)
0:没
1:有
*has_cxx_dtor(是否有使用到C++相关的代码/C++语言相关的内容,0/1)
0:没
1:有
ARC中也可以用这个标识位来表示对象是通过ARC来进行内存管理的
*shiftcls(表示当前对象的类对象的指针地址)
image.png*magic
*weakly_referenced(标识这个对象是否有响应的弱引用指针)
*deallocating(标识这个对象当前是否正在进行dealloc操作)
*has_sidetable_rc(是指当前这个isa指针当中如果所存储的引用计数已经达到上限了,那么需要外挂一个sidetable这样一个数据结构去存储相关的引用计数内容,也就是散列表)
*extra_rc(额外的引用计数,当引用计数在一个很小的值的范围之内,就会存到这个isa指针当中,而不是单独的引用计数表去存它的引用计数)
image.png总结:通过NONPOINTER_ISA 64个比特位的分析可知,关于内存管理,不仅仅是散列表,还有isa部分的extra_rc来存储相关的引用计数值。
网友评论