iOS21-如何理解内存管理机制

众所周知,iOS中的内存管理机制是一个非常重要的技术知识点,其实它的原理就是“引用计数”。
前述:那何为引用计数?
---> 引用计数就是指一个对象所生成的内存,这个内存到底有几个“持有者”(即引用),这里面的“几个”就是指引用计数的数值。
那我们知道当一个对象通过alloc或者new的时候,系统就会开辟一个内存空间给它用,让它在系统中有一席之地,让它可以展示它的功能或者界面等等。此时它的引用计数就会从0变成1,

为什么?
因为在该控制器下引用它了,自然而然,它的引用计数就+1,这个是系统帮我们计算好的(ARC模式下),所以不用我们操心。此时有几个类或者对象持有你新建的这个对象,那么它的引用计数就会“加几”

还有一个:对象的内存一般被分配到堆上,基本数据类型的内存一般被分配在栈上,我们所说的内存管理是针对堆上的,而不是栈的,栈是是由系统自动管理的,不需要我们去管理

那常用修饰OC数据类型的修饰符有几个呢?
retain :实例方法,引用计数+1;(修饰NSString就是浅拷贝,指针拷贝)所以不会开辟新的内存空间
copy : 实例方法,把一个对象复制到新的内存空间,新的内存空间引用计数+1,旧的不会;主要修改Block,NSString类型(修饰NSString就是深拷贝,内容拷贝)
(浅拷贝只是拷贝地址,不会开辟新的内存空间;深拷贝是拷贝内容,会开辟新的内存空间)
strong :强引用; 引用计数+1;主要修改对象,强引用(也可以修饰Block)
weak:弱引用,主要修饰delegate
assign : 弱引用 ,主要修饰基本数据类型,不能用于修饰对象,会导致野指针的出现,在你创建对象后就会被释放掉,你再使用系统就会报野指针的错误,但一般系统会在你初始化的时候就会提示你这个问题,需要注意,如下图:


image.png

那我们再详细说一下:内存的几大区域:
1、栈区(Stack):由编译器分配和释放,主要存放的是函数的参数值,局部变量等,栈区是系统的数据结构,对应的线程/进程是唯一的。特点就是快速高效,但由于不是我们程序员管理,所以数据管理不灵活。

栈存放数据的方式是:先进后出
栈分配包括:动态分配、静态分配

2、堆区(heap):

不同堆分配的内存数据 是不能互相操作的
堆空间分配总是动态的

当然,这只是内存管理的一小片只是,大家可以一起交流下

你可能感兴趣的:(iOS21-如何理解内存管理机制)