iOS复习笔记4:内存管理

一 基础原理

1 为什么需要内存管理

因为移动设备内存有限,每个app所占用的空间有限。

当app占用内存空间过多时,系统会发出内存警告,这是回收一些不在使用的内存。

例如:不再使用的类对象和实例。

2 管理对象

任何继承自NSObject类的对象

3 内存区域

堆:主动分配空间,需要管理

栈:局部变量,自动管理

例如:

int a = 1;

Person* p = [[Person alloc] init];

a,p都放在栈区

Person分配的空间在堆区

二 引用计数

1 定义

每个OC对象都有一个引用计数,是一个4个字节的整数,表示“被引用的次数”。

可以使用retainCount方法查看一个对象的引用计数。

2 作用

一个对象创建(alloc/new/copy)时为1;

引用计数变为0时,会被系统回收。

引用计数变不为0时,它占用的内存不可能被回收,除非整个程序退出。

3 引用计数操作

retain +1

release -1

4 对象销毁

一个对象引用计数为0时,其占用的内存会被系统销毁。

被销毁时,系统会向对象发送一条dealloc消息。

因此,一般需要重写dealloc方法,首先调用父类的dealloc,然后释放自己的资源。

对象销毁后,其内存被回收,继续使用会导致程序crash(野指针)。

*dealloc不能手动调用

示例

@interface Person

@property int m_nAge;

@end

@implementation Person

- (void)dealloc
{
	NSLog(@"dealloc");// 验证对象是否被回收
	[super dealloc];
}

@end

#import <Foundation/Foundation.h>

int main()
{
	// 默认为1
	Person* p = [[Person] init];
	NSUInteger count = [p retainCount];
	NSLog(@"retainCount == %ld", count);

	// +1,变为2,retain返回值为对象本身
	[p retain];

	// -1,变为1
	[p release];

	// -1,变为0,被回收,被回收之后p变为野指针,指向的对象变为僵死对象
	// 不能对僵死对象发送任何消息,包括retain
	[p release];

	// 报错:EXC_BAD_ACCESS
	// p.m_nAge = 10

	// 防止野指针错误,因为给nil对象发送消息不报错,只有警告
	p = nil;

	// 开启僵尸检查之后才报错:setXXX,message sent to deallocated instance
	p.m_nAge = 10

	return 0;
}

使用被回收的对象报错:EXC_BAD_ACCESS,访问了一块被回收的内存,即野指针错误

三 总结

1 基本方法

retain

release

retainCount

dealloc

2 概念

僵尸对象:所占用内被回收的对象:

野指针:指向僵尸对象

空指针:没有指向任何地址,存储的地址为0/NULL/nil

时间: 2024-10-13 17:19:42

iOS复习笔记4:内存管理的相关文章

iOS复习笔记5:内存管理之set方法

1 alloc和release成对出现 2 set方法 2.1 基础类型直接赋值 2.2 OC对象:判断不等.retain新的,释放旧的,再赋值 3 dealloc方法 3.1 一定要调用[super dealloc];且放在最后 3.2 self拥有的对象要做一次release @interface Book { int _price; } - (void)setPrice:(int)price; - (int)price; @end @implementation Book - (void)

iOS学习笔记之内存管理及@property

iOS5之后苹果公司引入了ARC机制,大大方便了ios开发者对内存的管理机制.在iphone 4出世的时候为什么ios在512M的内存中可以运行很大的游戏,保持畅快流畅的状态.得益于ios非常好的内存处理机制. 在我们现在创建项目的时候,默认会直接引入ARC机制,我们可以关闭ARC机制:在输入框中输入long点击搜索按钮,如图: 接下来即可进行老版本的内存操作了. 在老版本中,内存操作采用了引用计数(retainCount)alloc retain(+1)release(-1) 内存管理原则(配

ios学习笔记之内存管理

一,内存管理类型定义      1,基本类型  任何C的类型,eg:      int,short,char,long,long long,struct,enum,union等属于基本类型或结构体      内存管理对于C语言的基本类型无效      2,OC类型(非基本类型)      任何继承于NSObject类的对象都属于OC类型      也就是除了C之外的其他类型 二,OC对象结构      所有OC对象都有着一个计数器,保留着当前对象被引用的数量,如果计数器为0,那么就真正的释放这个

《python源码剖析》笔记 pythonm内存管理机制

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.内存管理架构 Python的内存管理机制都有两套实现:debug模式和release模式 Python内存管理机制的层次结构: 图16-1 第0层是操作系统提供的内存管理接口,如malloc.free 第1层是Python基于第0层操作系统的内存管理接口包装而成的,主要是为了处理与平台相关的内存分配行为. 实现是一组以PyMem_为前缀的函数族 两套接口:函数和宏. 宏,可以避免函数调

linux kernel学习笔记-5内存管理(转)

http://blog.sina.com.cn/s/blog_65373f1401019dtz.htmllinux kernel学习笔记-5 内存管理1. 相关的数据结构 相比用户空间而言,在内核中分配内存往往受到更多的限制,比如内核中很多情况下不能睡眠,此外处理内存分配失败也不像用户空间那么容易.内核使用了页和区两种数据结构来管理内存: 1.1 页 内核把物理页作为内存管理的基本单位.尽管CPU的最小可寻址单位通常为字(甚至字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的

Linux System Programming 学习笔记(九) 内存管理

1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系结构决定了内存页大小,32位系统通常是 4KB, 64位系统通常是 8KB 内存页分为 valid or invalid: A valid page is associated with an actual page of data,例如RAM或者磁盘上的文件 An invalid page is

《30天自制操作系统》笔记(07)——内存管理

<30天自制操作系统>笔记(07)--内存管理 进度回顾 上一篇中处理掉了绝大部分与CPU配置相关的东西.本篇介绍内存管理的思路和算法. 现在想想,从软件工程师的角度看,CPU也只是一个软件而已:它的功能就是加载指令.执行指令和响应中断,而响应中断也是在加载指令.执行指令.就像火车沿着一条环形铁轨前进:当中断发生时,就好像铁轨岔口处变轨了,火车就顺着另一条轨迹走了:走完之后又绕回来重新开始.决定CPU是否变轨的,就是CPU里的特定寄存器. 这是题外话,就此为止. 什么是内存管理 假设内存大小是

操作系统概念学习笔记 15 内存管理(一)

操作系统概念学习笔记 15 内存管理(一) 背景 内存是现代计算机运行的中心.内存有很大一组字或字节组成,每个字或字节都有它们自己的地址.CPU根据程序计数器(PC)的值从内存中提取指令,这些指令可能会引起进一步对特定内存地址的读取和写入. 一个典型指令执行周期,首先从内存中读取指令.接着该指令被解码,且可能需要从内存中读取操作数.在指令对操作数执行后,其结果可能被存回到内存.内存单元只看到地址流,而并不直到这些地址是如何产生的(由指令计数器.索引.间接寻址.实地址等)或它们是什么地址(指令或数

操作系统概念学习笔记 16 内存管理(二) 段页

操作系统概念学习笔记 16 内存管理 (二) 分页(paging) 分页(paging)内存管理方案允许进程的物理地址空间可以使非连续的.分页避免了将不同大小的内存块匹配到交换空间上(前面叙述的内存管理方案都有这个问题,当位于内存中的代码和数据需要换出时,必须现在备份存储上找到空间,这是问题就产生了.备份存储也有前面所述的与内存相关的碎片问题,只不过访问更慢). 传统上,分页支持一直是由硬件来处理的.最近的设计是通过将硬件和操作系统相配合来实现分页. 基本方法 实现分页的基本方法设计将物理内存分