内存管理
来源:互联网 发布:如何打印淘宝电子发票 编辑:程序博客网 时间:2024/05/29 11:14
-----------------------------------------
今天: 手动内存管理
-----------------------------------------
手动内存管理(Manual Reference Counting)(应用非常灵活)
ARC (Automatic Reference Counting)
手动内存管理
一、为什么要内存管理(作用)
回顾堆栈的区别 生命周期
栈空间 函数 函数中局部变量 调用函数压栈 函数调用结束 释放
数据段 静态变量 全局变量 程序开始 程序结束 释放
堆: malloc alloc 程序猿手动释放 free() release
static 声明的变量 创建和销毁时间和全局变量一样,都是main函数之前,main函数之后
作用域不同:静态变量的作用域是在变量声明的作用域内,全局变量的作用域是整个main函数
二 内存管理的定义:
内存管理就是确保开辟的堆空间被正确的释放。
内存管理中的问题:
1。内存泄露 堆空间没有释放
2. 内存崩溃 野指针 (过早释放:使用已经释放的空间
重复释放:重复释放同一个空间)
三 C语言内存管理的缺陷:
1 释放一个堆 ,必须保证所有使用堆的指针结束使用,避免(提前释放);
2 释放一个指针,确保指向同一个堆的指针,只有一个被释放,避免(重复释放);
3 模块化分工编程,不易明确谁来释放
4 多线程操作,不能确定哪个线程最后结束
四 OC中如何创建对象:
创建对象
1.分配内存空间,存储对象
2.初始化成员变量
3.返回对象的指针地址
五 内存管理的基本原则:
1.对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数retainCount = 0的时候,系统会毫不犹豫回收当前对象
alloc 1
2.[对象 retain] reatinCount + 1 ,返回self
3.[对象 release] reatinCount - 1
4.我们的引用计数retainCount = 0时 对象就被销毁了
5.dealloc函数,当一个对象要被销毁的时候,系统会自动调用dealloc函数,通知对象你将要被销毁
内存管理原则(配对原则):只要出现了 new,alloc,retain,就一定配对出现一个release,autorelease
// 为什么最后不为0?
最后一次输出,引用计数没有变成0.
这是为什么呢?
因为该对象的内存已经被回收,而我们向一个已经被回收的对象发了一个retainCount消息,所以它的输出结果应该是不确定的,如果该对象所占的内存被复用了,那么就有可能造成程序异常崩溃。
那为什么在这个对象被回收之后,这个不确定的值是1而不是0呢?这是因为当最后一次执行release时,系统知道马上就要回收内存了,就没有必要再将retainCount减1了,因为不管减不减1,该对象都肯定会被回收,而对象被回收后,它的所有的内存区域,包括retainCount值也变得没有意义。不将这个值从1变成0,可以减少一次内存操作,加速对象的回收。
六、property
七、autorelease
自动释放 /延迟释放 /等一会儿再释放
八、自动释放池
九、数组的内存管理