zoukankan      html  css  js  c++  java
  • 内存管理

    内存分区
    内存主要分为:代码区、数据区、堆、栈四个区。
     
    1.代码区:存储指令,是静态区,就是只读的东西;
     
    2.数据区:分为初始化数据区和末初始化数据区。初始化数据:简单理解就是由初始值的变量、常量;末初始化数据:只声明末给的值的变量,运行前统统为0,之所以单独分出来,估计是性能考虑,因为这些东西都是0,没必要放在程序包里,也不用copy。
     
    3.栈:程序运行记录,每个线程,也就是每个执行序列各有一个(看crash log最容易理解),都是编译的时候能确定好的,还有一个特点就是这里面的数据可以不用指针,也不会丢;
     
    4.堆,最灵活的内存区,用途多多,动态分配和释放,编译时不能提前确定,我们的Objective-C对象都是这么来的,都存在这里,通常堆中的对象都是以指针来访问的,指针从线程栈中来,但不独属于某个线程,堆也是对复杂的运行时处理的基础支持,还有就是ARC还是MRR、“谁分配谁释放”说的都是堆上对象的管理;
     
    引用计数器来管理内存
     
    ObjC中没有垃圾回收机制,内存管理是依赖对象的引用计数器来进行的,每个创建出来的对象都对应一个整数(retainCount)引用计数器。
    ObjC中每个对象被创建出来,引用计数默认为1。
    当调用这个对象的alloc、retain、new、copy方法之后引用计数器自动在原来的基础上加1(ObjC中调用一个对象的方法就是给这个对象发送一个消息),当调用这个对象的release方法之后它的引用计数器减1,如果一个对象的引用计数器为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。
  • 相关阅读:
    nginx
    同步和异步
    什么是ACID
    关系型数据库特点小结
    js 简单小知识
    join 和 left join 和 right join的区别?
    mysql中having和where区别?
    include和require区别
    什么是脏读,不可重复,幻读?
    Mysql常见面试题
  • 原文地址:https://www.cnblogs.com/ganjinjin/p/5018600.html
Copyright © 2011-2022 走看看