堆和栈

作者: Small_Potato | 来源:发表于2020-04-02 16:55 被阅读0次

引入堆和栈的区别

1.按照惯例方式区分

  • 对于栈来说,是有系统编译器自动管理的,不需要程序员手动管理;
  • 对于堆来说,释放由程序员手动惯例,不及时回收容易产生内存泄露;

2.按照分配方式区分

  • 堆是动态分配和回收内存的,没有静态分配的堆;
  • 栈有两种分配方式:静态分配和动态分配;
    • 静态分配是系统编译器完成的,比如局部变量的分配
    • 动态分配是有alloc函数进行的,但是栈的动态分配和堆是不同的,它的动
      态分配也由系统编译器进行释放,不需要程序员手动管理

注意:iOS一个进程中栈内存只有1M,Mac也只有8M;

问题

1.为什么OC对象需要进行内存管理,而其它非对象类型比如基本数据类型就不需要进行内存管理呢?
2.只有OC对象才需要进行内存管理的本质原因?

OC中的对象在内存中是以堆的方式分配空间,并且对的内存是由程序员来释放的
OC对象存放于堆里面(堆内存要程序员手动回收)
非OC对象一般放在栈里面(栈内存会被系统自动回收)
堆里面的内存是动态分配的,所以也就需要程序员手动的去添加内存、回收内存

注意:通常以这种方式创建对象:
NSObject *obj = [[NSObject alloc] init];
系统会在(\color{red}{栈上存储obj这个指针变量,它所指的对象在堆中}).通过[NSObject alloc]系统会为其在堆中开辟一块内存空间,并为其生成NSObject所需内存结构布局.

堆和栈的对比

栈对象
优点:1. 高速,在栈上分配内存是非常快的.2. 简单,栈对象有自己的生命周期,你永远不可能发生内存泄露.因为他总是在超出他的作用域时被自动销毁了.

缺点:栈对象严格的定义了生命周期也是其主要的缺点,栈对象的生命周期不适于Objective-C的引用计数内存管理方法.

相关文章

  • 10.11java中的堆和栈

    java高级-堆和栈 java堆 /栈 栈内存 / 堆内存的区别 1. java堆 /栈 2. 栈内存 / 堆内存的区别

  • 堆和栈

    一 java 堆内存和栈内存 java把内存分为两种:一种是堆内存,一种是栈内存 堆: 堆内存主要存储实例化对象,...

  • 堆和栈

    栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等,栈是向低地址扩展的数据结构,...

  • 堆和栈

    堆和栈在内存地址空间中的位置是不一样的,堆向上增长,而栈向下增长;其次,他们的功能也不一样,堆中的空间程序员可以自...

  • 堆和栈

    基本要点 基本数据类型、局部变量都是存放在栈内存中的,用完就消失了。new创建的实例化对象及数组,是放在堆内存中的...

  • 堆和栈

     按管理方式看:oc对象存放于堆里面(堆内存需要程序员手动回收) 非oc对象一般放在栈里面(栈内存会被系统自...

  • 堆和栈

    一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放...

  • 堆和栈

    问题描述 编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅...

  • 堆和栈

    在数据结构中堆和栈都是一种数据项按序排列的数据结构,但我们今天所说的重点并不是数据结构中的堆和栈,而是C语言内存分...

  • 堆和栈

网友评论

      本文标题:堆和栈

      本文链接:https://www.haomeiwen.com/subject/ozgxphtx.html