博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存管理
阅读量:5156 次
发布时间:2019-06-13

本文共 1635 字,大约阅读时间需要 5 分钟。

内存分为五大区域:栈区(存放局部变量),堆区(申请内存空间存储程序运行中动态分配的存储空间),BSS段,数据区,代码区【后三个是程序启动时使用】尽可能的减少全局变量

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

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

任何自己创建的对象,都归自己所有。可以使用名字以alloc或new开头或名字中包含copy的方法创建对象,可以使用retain来获得一个对象的所有权。retainCount(对象的引用计数器)用来表示当前对象到底有几个所有者。

在每个OC对象内部,都专门有8个字节的存储空间来存储引用计数器。引用计数器是判断对象要不要回收的依据,当retainCount值为0时,回收对象;当对象值为nil时,retainCount值为0,不回收。Person * p = nil;

给对象发送retain消息,使计数器+1(该方法返回对象本身);release消息,计数器-1(并不代表释放对象);retainCount消息,获得对象当前的引用计数器的值。

当对象被销毁时,系统会自动向对象发送一条“dealloc”消息,一般会重写dealloc方法,调用[super dealloc],并且放在代码块最后调用(不能直接调用dealloc方法)

一旦对象被回收了,那么他所占据的存储空间就不可再拥有,坚持使用会导致程序崩溃(野指针错误)。

OC内存管理分类:1,MRC(手动内存管理)2,ARC(自动引用计数)3,垃圾回收(ios并不支持垃圾回收)需要理解MRC,但实际使用尽量使用ARC。

手动内存管理快速入门

1 引用计数器:

        用来保存当前对象有几个东西在使用它(数字)

2 引用计数器的作用:

        用来判断对象是否应该回收内存空间(如果对象不等于nil,当引用计数器为0,此时要回收对象的内存空间)

3  引用计数器的操作:

        retain  使得引用计数器+1

        release   使得引用计数器-1

       retainCount 得到引用计数器的值

4  如果一个对象被释放的时候,会有“临终遗言”(会调用该对象的dealloc方法)

   注意:

       1)dealloc方法是NSObject的,一般我们要重写dealloc方法

      2)在dealloc方法的内部,要调用[super dealloc]

5 手动内存管理

     注意:创建一个项目,此时默认的是ARC的(自动内存管理)

      把项目从ARC模式改成MRC模式

      用Person类实例化一个对象

      证明有一个所有者

重写dealloc方法,代码规范

1)一定要[super dealloc],而且要放到最后,意义是:先释放子类占用的空间再释放父类占用的空间

内存管理的原则

     内存管理:对象如果不使用了,就应该回收他的空间,防止造成内存泄露

     内存管理的范围:所有的集成了NSObject的对象的内存管理,基本数据类型(int double char flozat struct enum)的数据内存不需要我们进行管理

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

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

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

2     谁创建    谁release

3   谁retain    谁release

 

内存管理研究的内容:

   1)野指针:定义的指针变量没有初始化    指向的空间已经释放了

   2) 内存泄露:Person *p = [Person new];

               P栈区

                   [Person  new];堆区

单个对象的内存管理:

 

 

 

 

 

 

 

 

 

 

 
 

转载于:https://www.cnblogs.com/quwujin/p/4741230.html

你可能感兴趣的文章
获取国内随机IP的函数
查看>>
今天第一次写博客
查看>>
江城子·己亥年戊辰月丁丑日话凄凉
查看>>
IP V4 和 IP V6 初识
查看>>
Spring Mvc模式下Jquery Ajax 与后台交互操作
查看>>
(转)matlab练习程序(HOG方向梯度直方图)
查看>>
『Raid 平面最近点对』
查看>>
【ADO.NET基础-数据加密】第一篇(加密解密篇)
查看>>
C语言基础小结(一)
查看>>
STL中的优先级队列priority_queue
查看>>
UE4 使用UGM制作血条
查看>>
浏览器对属性兼容性支持力度查询网址
查看>>
OO学习总结与体会
查看>>
虚拟机长时间不关造成的问题
查看>>
校门外的树2 contest 树状数组练习 T4
查看>>
面试整理:Python基础
查看>>
Python核心编程——多线程threading和队列
查看>>
Program exited with code **** 相关解释
查看>>
植物大战僵尸中文年度版
查看>>
26、linux 几个C函数,nanosleep,lstat,unlink
查看>>