编程:垃圾回收
垃圾回收是指:在电脑的动态存储器(现在通常的内存)不在需要使用,就应该进行释放,让出这部分存储器(内存),这种资源管理行为称之为垃圾回收
基本实现原理:某个对象在未来程序中不用使用,向这些对象要求回归存储器
实现算法:参考记数、追踪收集、标记清除、复制收集、堆积压缩、标记压缩
垃圾回收的初期目的是为了避免内存泄漏(开发者在编程过程中没有释放内存导致的内存不断递增或不合理的释放内存导致的指针指向被释放的内存地址产生的程序错误),现在的垃圾回收算法还会进行数据压缩等高级实现
只要会手动操作内存,那就需要垃圾回收,针对的是动态调用内存空间的变量。
主要讨论object-c上实现的引用计数的垃圾回收原理。
Object-c算是面向对象的程序语言,其中所有的对象都是调用内存空间
(C语言中通过malloc,calloc,realloc,free等标准库中的方法调用内存空间,free就是用来释放空间的操作,c++中相对容易理解,用new和delete来申请和释放内存,同时就是创建对象和删除对象,和object-c类似,但默认c及c++都不支持垃圾回收,需自行实现)
object-c内部完整实现了引用计数的垃圾回收机制
在object-c中可以选择是否自动垃圾回收(新版本),我们这边不讨论,说下底层的实现。
每个对象都内置个引用计数count,有4个关键词:alloc/init、retain、release、dealloc
- Alloc/init:alloc和c中一样,用来申请一个内存空间,在object-c就是创建对象,init就是初始化该对象,通常的写法:NSString* string = [[NSString alloc] init];创建并初始化一个字符串对象,在这个过程中count会被初始化为1,count=1
- Retain:retain是内置的方法,写成[string retain];这个操作会将count加1,count++
- Release:release也是内置的方法,写成[string release];count进行减1,count--
- Dealloc:dealloc是用来销毁对象释放内存的,当对象的引用计数为0,count==0时,该方法会被自动调用,也可以自动调用该方法。
在开发过程中遵循一个原则,谁要使用该对象,就需要使用该对象的retain方法,当使用完后再使用该对象的release方法,这就是完整的引用计数原理
在技巧上:可以通过对象封装的函数接口操作对象,彻底规避retain和release方法
引用计数有许多技巧上的管理方法,主要目的保证程序开发中便捷的内存管理。
在内存管理的技巧上还有很多方法可以利用,垃圾回收只是一种内存管理的技巧
在目前多数的高级语言中已经在语言底层实现了自动垃圾回收,java、C#等