引入堆和栈的区别
1.按照惯例方式区分
- 对于栈来说,是有系统编译器自动管理的,不需要程序员手动管理;
- 对于堆来说,释放由程序员手动惯例,不及时回收容易产生内存泄露;
2.按照分配方式区分
- 堆是动态分配和回收内存的,没有静态分配的堆;
- 栈有两种分配方式:静态分配和动态分配;
- 静态分配是系统编译器完成的,比如局部变量的分配
- 动态分配是有alloc函数进行的,但是栈的动态分配和堆是不同的,它的动
态分配也由系统编译器进行释放,不需要程序员手动管理
注意:iOS一个进程中栈内存只有1M,Mac也只有8M;
问题
1.为什么OC对象需要进行内存管理,而其它非对象类型比如基本数据类型就不需要进行内存管理呢?
2.只有OC对象才需要进行内存管理的本质原因?
OC中的对象在内存中是以堆的方式分配空间,并且对的内存是由程序员来释放的
OC对象存放于堆里面(堆内存要程序员手动回收)
非OC对象一般放在栈里面(栈内存会被系统自动回收)
堆里面的内存是动态分配的,所以也就需要程序员手动的去添加内存、回收内存
注意:通常以这种方式创建对象:
NSObject *obj = [[NSObject alloc] init];
系统会在().通过[NSObject alloc]系统会为其在堆中开辟一块内存空间,并为其生成NSObject所需内存结构布局.
堆和栈的对比
栈对象
优点:
1. 高速,在栈上分配内存是非常快的.2. 简单,栈对象有自己的生命周期,你永远不可能发生内存泄露.因为他总是在超出他的作用域时被自动销毁了.
缺点:
栈对象严格的定义了生命周期也是其主要的缺点,栈对象的生命周期不适于Objective-C的引用计数内存管理方法.
网友评论