程序员人生 网站导航

OC中内存管理问题之引用计数

栏目:综合技术时间:2015-01-07 08:37:56

定义1个Person类

其实援用计数这个问题大家可以理解为租房子的问题, 如果有retain alloc 代表这个人租了这间大房子, 拿到了1把钥匙, 援用计数代表房子1共有的钥匙的数量, release代表退房归还钥匙

        Person * p = [[Person alloc] init];//房东盖好了1间房子, 现在是房东1个人

        //alloc 开辟空间,援用计数由0变成1

        //retainCount,用于查看对象的援用计数

        NSLog(@"%lu", [p retainCount]);

       Person * p1 = [p retain];// retain1次, 代表又来1个人租房

       NSLog(@"p1 = %lu", [p1 retainCount]);//援用计数1⑵

        NSLog(@"%lu", [p retainCount]);//援用计数1⑵

Person * p2 = p1;//没有retain 也没有alloc 援用计数不变. 就相当于p1带他的朋友来住,朋友没有钥匙的

//release 减少援用计数(归还钥匙)

        [p release];//援用计数2⑴

[p release];//援用计数1-0(但是如果我们去输出的话, 多是会显示崩溃, 或是1, 缘由以下:)

NSLog(@"%lu", [p retainCount]);// 首先这样写肯定是不对的 , 最后1次release,系统已回收掉这块内存,空间已还给系统,空间已不归你管理,如果此时在访问,就访问了1块没有所有权的空间,所以下面的操作可能会出现野指针问题

我们还以上面的租房子问题为例, 现在这间房子最后1个人已走了, 已没有人住了, 按说钥匙已全部交上去了, 但是我们现在的操作就像是又拿着他的钥匙去开那个门, 这是非常不安全的.那为何有时候会崩溃而有时候可以打印出1呢, 这是由于如果这块内存他人还没有使用, 就像是房子还没有租出去, 你再回去拿钥匙开门还是安全的, 但是如果这间房子又已租出去, 即已有别的数据在使用这块内存, 那你再回去开门, 那你的处境是相当的不安全有木有???

[p release];//野指针问题 +过渡释放,这个也很好理解, 大家可以理解成有房客拿1把钥匙, 不但要开门, 还要拿着这个钥匙再去归还1次, 要房东再次退房子押金, 背法了, 直接崩~


内存问题其实除上面提到的野指针和过度释放, 还有1个, 那就是内存泄漏, 内存泄漏我们可以理解为, 1为租客租房子最后钥匙没有归还, 这样房东也没有办法打开这间房子, 这间房子就没有办法再租出去, 致使内存浪费, 固然, 房东在有别的房子出租的时候, 对他来说并没有太大的影响, 但是1旦这样的房客有好多,房子不够租, 房东挣钱会愈来愈慢, 终究可能致使做不下去~

本文只是个人对内存援用计数的1些理解 有甚么不对的地方, 大家多多指出~

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐