OC当中野指针和内存泄露问题
2015-07-27 10:16
92 查看
定义一个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];//野指针问题
+过渡释放,这个也很好理解, 大家可以理解成有房客拿一把钥匙, 不但要开门, 还要拿着这个钥匙再去归还一次, 要房东再次退房子押金, 违法了, 直接崩~
内存问题其实除了上面提到的野指针和过度释放, 还有一个, 那就是内存泄露, 内存泄露我们可以理解为, 一为租客租房子最后钥匙没有归还, 这样房东也没有办法打开这间房子, 这间房子就没有办法再租出去, 导致内存浪费, 当然, 房东在有别的房子出租的时候, 对于他来讲并没有太大的影响, 但是一旦这样的房客有好多,房子不够租,
房东挣钱会越来越慢, 最终可能导致做不下去
其实引用计数这个问题大家可以理解为租房子的问题,
如果有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];//野指针问题
+过渡释放,这个也很好理解, 大家可以理解成有房客拿一把钥匙, 不但要开门, 还要拿着这个钥匙再去归还一次, 要房东再次退房子押金, 违法了, 直接崩~
内存问题其实除了上面提到的野指针和过度释放, 还有一个, 那就是内存泄露, 内存泄露我们可以理解为, 一为租客租房子最后钥匙没有归还, 这样房东也没有办法打开这间房子, 这间房子就没有办法再租出去, 导致内存浪费, 当然, 房东在有别的房子出租的时候, 对于他来讲并没有太大的影响, 但是一旦这样的房客有好多,房子不够租,
房东挣钱会越来越慢, 最终可能导致做不下去
相关文章推荐
- LeetCode-Binary Tree Postorder Traversal
- POJ 3259 Wormholes
- zabbix搭建总结
- 45、Android事件总线分发库的使用
- 微信get and post
- [iOS/Swift]String的 toInt() 和 integerValue 的区别
- 玩转Android---UI篇---Button(按钮)
- 中小型企业如何选择服务器配置?
- C# String与string的区别
- OO’s Sequence
- Java设计模式—工厂设计模式
- 使用xUtils-master中的HttpUtils进行断点续传
- 关于网络图片的采样与压缩保存
- thinkphp 整合 swiftmailer 实现邮件发送
- Source Insight函数调用关系显示设置http://blog.csdn.net/duanbeibei/article/details/24395777
- 数据结构---数组(1)
- java多线程-专题-聊聊并发(一)深入分析Volatile的实现原理
- silverlight 操作串口数据的代码
- iOS 集成银联支付(绕过文档的坑,快速集成)
- nc打开节点或者点开单据控制列表或者卡片元素