【Object - c 高级】01 内存管理 MRC

来源:互联网 发布:李勇seo博客 编辑:程序博客网 时间:2024/06/16 18:40

说道OC语言比较难理解比较绕弯弯的地方可能也就是内存管理这一块了, 正好复习到这里 就记录一下OC中的内存管理,如果您有幸看到此篇文章,请把我的不足之处指出谢谢!


 内存区域的划分

内存分为五大区域  栈内存  堆内存  bss段 数据区 代码段

|-- 1. 栈内存 存放啊局部变量 <不需要程序员进行管理>

|-- 2. 堆内存 程序运行中动态分配的存储空间<需要程序员管理>

|-- 3. bss段 没有初始化的全局变量和静态变量

|-- 4. 数据区 已经初始化的全局变量和静态变量及字符串常量

|-- 5.代码段 你写的代码

注意: 程序启动的时候主要加载 bss段 数据区 和代码段,所以:全局变量要,静态变量,字符串常量尽可能少的使用以减少程序启动的负担(个人理解)


而OC的内存管理主要是研究对象的内存,也就是主要研究堆区,所有继承自NSObject的对象


 内存管理的分类及原则

①OC中的内存管理分为三类(不对基本数据类型进行管理 如: int double float char struct enum)

|-- 1. MRC  (MannuReference Counting) 手动内存管理 在IOS4.1之前的版本我们要自己负责使用引用计数来管理内存,比如 retain release autorelease

|-- 2. ARC (automatic reference counting)  在IOS4.1之后推出 ARC是苹果推出的计数,苹果推荐开发者使用ARC计数来管理内存

|-- 3. garbage collection(垃圾回收) ios不支持垃圾回收

需要注意的是 我们在学习的时候要了解MRC 实际项目开发的时候要尽量用ARC


②OC中内存管理的原则

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

|-- 2. 只要你想使用这个对象 那么就该让这个对象的引用计数+1 (retian 一次)

|-- 3. 当你不想使用这个对象的时候 应该对对象的引用计数-1 (release 一次)

|-- 4. 谁创建 谁release

|-- 5. 谁retain 谁release


③OC中内存管理主要研究的内容

1. 野指针 以下是造成野指针的原因

|-- 1.1 定义指针变量没有初始化

|-- 1.2 指向的空间已经被释放

2.内存泄露

举例:

Person * person = [Person new]; 

person 在栈内存中 

Person new ]在堆内存中 

如果栈内存已经被释放 而堆内存的空间还没有释放 堆区的空间就被泄露了



 内存管理 基本知识

|-- 1. 什么是引用计数  答: 用来保存当前对象有多少个东西在使用它

|-- 2. 引用计数的作用 答: 用来判断对象是否应该回收内存空间(需要注意的是: 如果对象不等于nil,当引用计数为0 此时要回收对象的内存空间)

|-- 3. 引用计数的操作  答:retain 使引用计数 +1 release 使应用及时 -1  retainCount 是得到引用计数的值(retainCount 返回的是一个NSInteger 类型的值)

|-- 4. 如果对象被释放了肯定会调用本类中重写NSObject的 deallloc 方法

|-- 5. 注意 : 在dealloc 方法中一定要调用父类的 dealloc方法 既[super dealloc];


 配置手动内存管理

现在的Xcode创建出的项目都是ARC模式如何 将项目变为MRC模式 

点击项目的Target


右侧栏中如下图 1.在 搜索框中输入 auto 2.小箭头所指位置默认均为yes 全部改成 no即可


至此 MRC模式已经配置完成 

检测MRC是否可用 

1. 在target中新建一个类

2. 在主函数中 new出类的对象

3. 在该类的.m 文件中打 dealloc 调用[super dealloc]没有出错/ 或者 用类在主函数中创建的对象 调用对象的 relsese retain 方法 没有报错即可


 开启僵尸对象检测

首先点击target位置


然后点击 Edit Scheme...


然后选中 run 勾选 Enable Zombie Objects 最后点击close即可


这样我们的准备工作就都完成了

六 单个对象的内存管理(稍后完成)



0 0
原创粉丝点击