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方法来销毁这个对象。
  • 相关阅读:
    求解未知矩阵的一些方法
    数二2019-19真题最简单的解法
    极坐标转化为参数方程的题目
    隐函数的不定积分
    Go 语言高性能编程
    1457. Pseudo-Palindromic Paths in a Binary Tree (M)
    0754. Reach a Number (M)
    1345. Jump Game IV (H)
    0091. Decode Ways (M)
    0498. Diagonal Traverse (M)
  • 原文地址:https://www.cnblogs.com/ganjinjin/p/5018600.html
Copyright © 2011-2022 走看看