OC的内存管理

OC的内存管理分为MRC和ARC

MRC

手动引用计数,在iOS5.0之前使用的都是手动引用计数,遵循黄金管理法则,谁创建谁释放,通过alloc,new,copy创建的对象,要调用release,对一个对象retain操作的时候,也要调用release,当一个对象作为函数返回值返回的时候要调用autorelease。当一个对象调用autorelease操作的时候会被添加到最近的自动释放池当中,当一个自动释放池在销毁的时候会给它当中存储的对象统一发送一次release消息。

ARC

自动引用计数,通过LLVM编译器和Runtime共同协作管理内存。共有三种管理方式

1.TaggedPointer

iOS用于优化NSNumber,NSDate,NSString等小对象的存储,将对象指针拆分,一部分保留数据,一部分作特殊标。不够存数据时,会动态分配内存进行存储,维护引用计数,指针存储对象地址值。它里面不存在isa指针,所以严格意义上来说TaggedPointer指向的变量不是一个对象。在进行方法调用的时候会通过特殊标记直接去类对象中查找方法,不会使用isa指针查找的方式。

2.NONPOINTER_ISA(64位架构下iOS应用程序)

因为对象的地址有30多位就够了,所以里面存储了当前对象类对象的指针地址、当前对象是否有使用到C++方面的内容、当前对象是否有关联对象。

储存内存管理相关,是否内存管理数据过大,过大或用sidetable储存、是否正在进行dealloc操作、是否有相应的弱引用指针

3.散列表方式

SideTables()结构

图片发自App

Spinlock_t是“忙等”的锁,适用于轻量访问。

另外散列表中使用了分离锁的概念,目的是为了提高访问效率。

你可能感兴趣的:(OC的内存管理)