内存管理

来源:互联网 发布:如何打印淘宝电子发票 编辑:程序博客网 时间:2024/05/29 11:14

-----------------------------------------

 今天: 手动内存管理

-----------------------------------------

 

手动内存管理(Manual Reference Counting)(应用非常灵活)

ARC (Automatic Reference Counting)

 

手动内存管理

一、为什么要内存管理(作用)

回顾堆栈的区别                                                                          生命周期 

栈空间    函数 函数中局部变量             调用函数压栈    函数调用结束 释放

数据段    静态变量  全局变量                程序开始             程序结束 释放

堆:                malloc  alloc                                程序猿手动释放 free() release

static 声明的变量 创建和销毁时间和全局变量一样,都是main函数之前,main函数之后

作用域不同:静态变量的作用域是在变量声明的作用域内,全局变量的作用域是整个main函数

二 内存管理的定义:

内存管理就是确保开辟的堆空间被正确的释放。

内存管理中的问题:

1。内存泄露  堆空间没有释放

2. 内存崩溃 野指针 (过早释放:使用已经释放的空间     

重复释放:重复释放同一个空间)

 

 C语言内存管理的缺陷:

释放一个堆 ,必须保证所有使用堆的指针结束使用,避免(提前释放);

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

 

自动释放 /延迟释放 /等一会儿再释放

 

 

八、自动释放池

 

九、数组的内存管理

 

 

 

 

 

 

 

0 0
原创粉丝点击