转载请注明出处 http://blog.csdn.net/u014205968/article/details/69389363
Python GC 与 Objective-C ARC
提起GC(Garbage Collector)
我们首先想到的应该是JVM
的GC
,但是作者水平有限,Java
使用的不多,了解的也不够深入,所以本文的重点将放在对python gc
的讲解,以及对比OC
使用的ARC(Automatic Reference Counting)
。
本文需要读者有Python
或OC
的基础,如果遇到没有讲解清楚的地方,烦请自行查阅。
引用计数
因为Python
和OC
都使用了引用计数
作为内存管理的一种手段,所以先介绍一下引用计数
。
引用计数
是一种非常简单的追踪内存中对象的技术,可以这样想象,每一个对象都有一个内部的变量称为引用计数器
,这个引用计数器
记录了每个对象有多少个引用,我们称为引用计数
。当一个对象创建或者被赋值给其他变量时就会增加引用计数
,当对象不再被使用或手动释放时就会减少引用计数
,当引用计数
为0时也就表示没有变量指向该对象,程序也无法使用该对象,因此需要被回收。
在介绍Python
的引用计数之前先普及一下常识,python
中一切都是对象,对象赋值、函数参数传递都采用传引用而不是传值(也可以理解为传值,但是这个值不是对象的内容值而是对象的地址值),有些读者可能受到一些博客的影响会认为在传递数字类型或字符串类型时是传值而不是传址,看如下代码:
def swap(x, y):
temp = x
x = y
y = temp
if __name__ == '__main__':
a = 1
b = 2
swap(a, b)
print(a, b)
x = 'Jiaming Chen'
y = 'Zhouhang Wan'
swap(x, y)
print(x, y)
m = (1, 2)
n = (3, 4)
swap(m, n)
print(m, n)
python2.7 output:
(1, 2)
('Jiaming Chen', 'Zhouhang Wan')
((1, 2), (3, 4))
python3.5 output:
1, 2
'Jiaming Chen' 'Zhouhang Wan'
(1, 2) (3, 4)
很多读者认为上述代码执行了swap
函数以后并没有交换实参的值,因此认为python
在对数字类型、字符串类型或元组类型这样的参数是采用传值的方式进行的,实际上这是错误的理解,要记住python
中一切都是对象,所有的参数传递也都是传递引用即传址而不是传值,再看如下代码: