定义一个Person类
其实引用计数这个问题大家可以理解为租房子的问题, 如果有retain alloc 代表这个人租了这间大房子, 拿到了一把钥匙, 引用计数代表房子一共有的钥匙的数量, release代表退房归还钥匙
Person * p = [[Person alloc] init];//房东盖好了一间房子, 现在是房东一个人
//alloc 开辟空间,引用计数由0变为1
//retainCount,用于查看对象的引用计数
NSLog(@"%lu", [p retainCount]);
Person * p1 = [p retain];// retain一次, 代表又来一个人租房
NSLog(@"p1 = %lu", [p1 retainCount]);//引用计数1-2
NSLog(@"%lu", [p retainCount]);//引用计数1-2
Person * p2 = p1;//没有retain 也没有alloc 引用计数不变. 就相当于p1带他的朋友来住,朋友没有钥匙的
//release 减少引用计数(归还钥匙)
[p release];//引用计数2-1
[p release];//引用计数1-0(但是如果我们去输出的话, 可能是会显示崩溃, 或者是1, 原因如下:)
NSLog(@"%lu", [p retainCount]);// 首先这样写肯定是不对的 , 最后一次release,系统已经回收掉这块内存,空间已经还给系统,空间已经不归你管理,如果此时在访问,就访问了一块没有所有权的空间,所以下面的操作可能会出现野指针问题
我们还以上面的租房子问题为例, 现在这间房子最后一个人已经走了, 已经没有人住了, 按说钥匙已经全部交上去了, 但是我们现在的操作就像是又拿着他的钥匙去开那个门, 这是非常不安全的.那为什么有时候会崩溃而有时候可以打印出1呢, 这是因为如果这块内存别人还没有使用, 就像是房子还没有租出去, 你再回去拿钥匙开门还是安全的, 但是如果这间房子又已经租出去, 即已经有别的数据在使用这块内存, 那你再回去开门, 那你的处境是相当的不安全有木有???
[p release];//野指针问题 +过渡释放,这个也很好理解, 大家可以理解成有房客拿一把钥匙, 不但要开门, 还要拿着这个钥匙再去归还一次, 要房东再次退房子押金, 违法了, 直接崩~
内存问题其实除了上面提到的野指针和过度释放, 还有一个, 那就是内存泄露, 内存泄露我们可以理解为, 一为租客租房子最后钥匙没有归还, 这样房东也没有办法打开这间房子, 这间房子就没有办法再租出去, 导致内存浪费, 当然, 房东在有别的房子出租的时候, 对于他来讲并没有太大的影响, 但是一旦这样的房客有好多,房子不够租, 房东挣钱会越来越慢, 最终可能导致做不下去~
本文只是个人对内存引用计数的一些理解 有什么不对的地方, 大家多多指出~
原文地址:http://blog.csdn.net/wmmbk/article/details/42340483