一、内存简单介绍

内存结构

1、运行时分配

(1)栈:用户存放程序临时创建的局部变量(先进后出)。

(2)堆:动态分配内存段。

2、编译器分配

(1)BSS段:存放未初始化的全局变量和静态变量。

(2)数据段:已初始化的全局变量和静态变量。

(3)代码段:执行代码的一块区域。

地址由低到高:代码段 -> 数据段 -> BSS段-> 堆 -> 栈

内存分配方式

1、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

2、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3、从堆上分配,亦称动态内存分配。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

二、OC内存管理(iOS7.0后不用手动管理,可以了解相关原理)

1、进行内存管理的原因:是由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。

2、内存管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。

本质原因是存储空间不一样,对象存储于堆中,而其它局部变量主要存放于栈中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。

3、对象的基本结构:每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。

在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。

引用计数器的作用:判断对象是否需要回收的唯一依据就是计数器是否为0,若不为0则存在。
4、当给对象发送消息时,进行引用计数器操作

Retain消息:使引用计数器+1,改方法返回对象本身

Release消息:使引用计数器-1(并不代表释放对象)

retainCount消息:获得对象当前的引用计数器值

5、当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,书写格式如下:

1 - (void)dealloc
2 {
3     [super dealloc] //必须调用必须调用调用此方法,且必须写在最后
4 }

6、注意事项:

野指针错误:访问了一块坏的内存(已经被回收的,不可用的内存)。

僵尸对象:所占内存已经被回收的对象,僵尸对象不能再被使用。(打开僵尸对象检测)

空指针:没有指向任何东西的指针(存储的东西是0,null,nil),给空指针发送消息不会报错

注意:不能使用[p retaion]让僵尸对象起死复生。

7、内存管理原则

(1)只要还有人在使用某个对象,那么这个对象就不会被回收。

   只要你想使用这个对象,那么就应该让这个对象的引用计数器+1。

   当你不想使用这个对象时,应该让对象的引用计数器-1。

(2)谁创建,谁release

   如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法

   不是你创建的就不用你去负责

(3)谁retain,谁release。只要你调用了retain,无论这个对象时如何生成的,你都要调用release。

三、内存管理中的循环引用问题以及解决

若使用#import的方式相互包含,就会形成了循环引用。这时可以使用一个@class来代替其中一个#improt来解决循环引用问题,提高性能!

@class仅仅告诉编译器,在进行编译的时候把后面的名字作为一个类来处理。

书写规范:@class 类名;

作用:声明一个类,告诉编译器某个名称是一个类。

具体用法:1、在.h文件中使用@class来声明类。

     2、在.m文件中真正要使用到的时候,使用#import来包含类中的所有东西。

     3、两端循环引用的解决方法:一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release)。

转载于:https://www.cnblogs.com/hissia/p/5448410.html

十二:内存简单介绍和OC的内存管理相关推荐

  1. 计算机网络(十二)IPv6介绍

    计算机网络(十二)IPv6介绍 1.IPv6的必要性 2.IPv6的特点 3.IPv6中IP地址的标记方法 4.IPv6地址的结构 5.全局单播地址 6.链路本地单播地址 7.唯一本地地址 8.IPv ...

  2. linux的swap与memory,【Linux】Linux中Swap与Memory内存简单介绍

    背景介绍 对于Linux来说,其在服务器市场的使用已经占据了绝对的霸主地位,不可动摇.Linux的各种设计思想和使用也被传承(当然不乏各种黑Linux,而且黑的漂亮).Linux的很多独特的设计,对性 ...

  3. 第十二章-硬盘介绍和磁盘管理 随堂笔记

    第十二章-硬盘介绍和磁盘管理 本节所讲内容: 12.1 SAS-SATA-SSD-SCSI-IDE硬盘讲解 12.2 磁盘分区工具和挂载 12.3 实战扩展swap分区 12.1 SAS-SATA-S ...

  4. spark executor内存分配_二十二、Spark之图解Executor端内存管理

    Spark应用程序执行时,Spark集群会启动Driver和Executor两种JVM进程,Driver端负责创建SparkContext上下文(通往集群的唯一通道),构建DAG, 创建Task并进行 ...

  5. 【嵌入式开发】ARM 内存操作 ( DRAM SRAM 类型 简介 | Logical Bank | 内存地址空间介绍 | 内存芯片连接方式 | 内存初始化 | 汇编代码示例 )

    文章目录 一. 内存 简介 1. 两大内存分类 ( 1 ) DRAM 简介 ( 定期刷新 | 速度慢 | 成本低 ) ( 2 ) SRAM 简介 ( 不需刷新 | 存取速度快 | 功耗大 | 成本高 ...

  6. salesforce 零基础学习(四十二)简单文件上传下载

    项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文 ...

  7. Java(二)——简单的理解下面向对象内存分析

    学习进入到面向对象初级阶段,看到代码的执行过程便很蒙圈.后来经同学指点告诉我说让我看看面向对象的内存分析,会对代码的理解有所帮助,这里就针对面向对象的内存分析进行阐述.(有些图和代码可能借助于网络和其 ...

  8. 《C#零基础入门之百识百例》(五十二)封装介绍 -- 二维多项式求值

    C#零基础入门 面向对象 -- 封装介绍 -- 二维多项式求值 前言 一,封装概念 二,封装属性 三,实例练习 -- 二维多项式求值 3.1 题目描述 3.2 问题分析 3.3 参考代码 前言 本文属 ...

  9. 深入浅出JMS(二)–ActiveMQ简单介绍以及安装(转载)

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了消息通信的规范JM ...

最新文章

  1. 超全Python速查表登上GitHub热榜,标星4600+!(附链接)
  2. 「场景化」增长的践行者:探寻大数据时代的商业变革
  3. erlang精要(22)-归集器、记录
  4. 双指针--Codeforces Round #645 (Div. 2) d题
  5. 易于使用的人工智能_需求分析:如何使用这种易于启动的方法+一个案例研究...
  6. 半素数c语言,非常简单的c题目 不懂 紧急求助
  7. html代码大全贴音乐,网页音乐代码大全
  8. asp判断是否移动端_ASP判断当前访问的是PC端还是移动设备端
  9. Unity3D(七)声音
  10. C# dapper 使用事务
  11. 技术与管理看看华为怎么说
  12. 同构数的算法——C语言
  13. 怎么复制图片的html代码,修改设置让你轻松复制网页文字或图片
  14. EasySchedulerr大数据调度系统架构分析
  15. 电驴emule使用教程
  16. 亚马逊多账户操作需要知道哪些规则
  17. 这6个编程语言排行榜,据说全都知道的人不足1% | 年终榜单大盘点
  18. Windows Vista 官方中文正式版(MSDN)(转载)
  19. nginx禁止外网访问
  20. 程序员不一定要进大厂,但是算法一定要学

热门文章

  1. php 5.4 aws,使用 Amazon EC2 管理 AWS SDK for PHP 实例 - 适用于 PHP 的 AWS 开发工具包
  2. CSAPP:第十一章 网络编程
  3. 正则表达式之反向引用
  4. C++ 中关于optional 使用过程中遇到的问题
  5. Java中String为什么是final
  6. (五十五)iOS多线程之GCD
  7. VMware下Windows Server 2012添加新磁盘
  8. Jenkins构建 netcore5.0 项目时出现NU3028/NU3037错误的解决方案
  9. hexo 环境变量_小白使用 Github + Hexo 从 0 搭建一个博客
  10. Android通知点击事件传递参数