关于Objective-C 对象release操作的一个小问题探讨
最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的
然后写了这样一小段程序,运行
- (void)viewDidLoad { [super viewDidLoad]; Test *testObj = [[Test alloc] init]; NSLog(@"release 前 %d",[testObj retainCount]); [testObj release]; NSLog(@"release 后 %d",[testObj retainCount]); }
明明release了,retainCount计数应该为0,但是 为什么retainCount计数还是1,当我们release操作两次的时候程序就崩溃了;
然后我们打印一下testObj对象
- (void)viewDidLoad { [super viewDidLoad]; Test *testObj = [[Test alloc] init]; NSLog(@"release 前 %d",[testObj retainCount]); NSLog(@"testObj release指向-->%@",testObj); [testObj release]; NSLog(@"release 后 %d",[testObj retainCount]); NSLog(@"testObj release指向-->%@",testObj); }
发现他们指向同一块地址;
testObj 在alloc的时候在堆上申请到一片空间,然后它的retainCount计数为1,然后我们release之后,testObj指向的空间被销毁了,不存在了。此时testObj就是一个野指针了;此时我们调用[testObj retainCount]就属于一个不安全的做法;
然后我们在添加一行代码,[testObj release]之后,添加 testObj = nil;
- (void)viewDidLoad { [super viewDidLoad]; Test *testObj = [[Test alloc] init]; NSLog(@"release 前 %d",[testObj retainCount]); NSLog(@"testObj release指向-->%@",testObj); [testObj release]; testObj = nil; NSLog(@"release 后 %d",[testObj retainCount]); NSLog(@"testObj release指向-->%@",testObj); }
唉,看到这里就应该明白了吧,[testObj release] 后,testObj仍有指向,只是testObj原来指向的那片空间已被销毁,但是本身还存在,通过置为nil这一步操作,就不在指向原来那片地址;应该记起viewDidUnload函数作用了吧,它就是干这个活的,我们申明一个对象属性的时候,在viewDidUnload中将这个属性置为nil这一步操作;
本文转自新风作浪 51CTO博客,原文链接:http://blog.51cto.com/duxinfeng/1208672,如需转载请自行联系原作者
关于Objective-C 对象release操作的一个小问题探讨相关推荐
- C语言操作MySQL-----又一个小技巧
C语言操作MySQL 连接MySQL 常用数据库操作函数 查询操作 1.`mysql_query()`函数 插入操作 修改操作 删除操作 在开始之前需要进行环境的配置,请参考这篇博客: VS2019配 ...
- 实践操作:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器
TensorFlow对象检测API是一个建立在TensorFlow之上的开源框架,可以轻松构建,训练和部署对象检测模型. 到目前为止,API的性能给我留下了深刻的印象.在这篇文章中,我将API的对象设 ...
- DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为(转)...
一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来. 首先,DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢 ...
- tfr 计算机硬件,实践操作:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器...
TensorFlow对象检测API是一个建立在TensorFlow之上的开源框架,可以轻松构建,训练和部署对象检测模型. 到目前为止,API的性能给我留下了深刻的印象.在这篇文章中,我将API的对象设 ...
- jQuery 1.6 源码学习(六)——core.js[6]之jQuery对象/数组操作相关方法
本文将分析jQuery对象操作相关方法(包括静态和实例方法): merge方法,代码如下: //此方法用于合并两个jQuery对象(因为jQuery对象中有length属性)或者数组,//这个方法非常 ...
- Java中的对象序列化操作
文章目录 1 Java中的对象序列化操作 1 Java中的对象序列化操作 首先看一下对象序列化的操作步骤: 创建一个类,继承Serializable接口 创建对象 将对象写入文件 从文件读取对象信息 ...
- python实现文件管理系统_Python使用文件操作实现一个XX信息管理系统的示例
大家好,我是第一次python学了一个学期,期末要完成一个毕业生信息管理系统大作业的小韩了,由于上次没有仔细看开发实现的要求,实现了一个简单的毕业生信息管理系统,而这次专门整理了两种使用文件进行保存数 ...
- unity双击打不开脚本_游戏对象和脚本 (创建一个时钟)
该文章是一篇译文,附上原文链接 Game Objects and Scriptscatlikecoding.com 使用简单对象构建一个时钟 编写一个C#脚本 转动时钟的指针来显示时间 创建指针动画 ...
- JavaScript(Dom对象的操作)
Dom对象的操作 核心 doucument 获得Dom节点 更新节点 实战演练 删除Dom节点 插入节点 把已有的标签进行插入 创建一个新的标签,实现插入 在子节点前插入(insertBefore) ...
最新文章
- 如何利用微信小游戏的分包加载机制突破4M代码包体积限制
- POJ2762 Going from u to v or from v to u? 强连通+缩点
- android 系统的切图方式_UI设计切图规范
- ArtRage中文版
- 有 OC 经验的程序员快速学习 Swift 语法
- leetcode 208. Implement Trie (Prefix Tree) | 208. 实现 Trie 前缀树(Java)
- 华为杯数学建模2020获奖名单_我校在2020年全国大学生数学建模竞赛中再获佳绩(内附获奖名单)...
- 【Clickhouse】Clickhouse 整合 Prometheus 监控 运行时状态
- vivado 如何创建工程模式_用Tcl定制Vivado设计实现流程
- 转:jwgkvsq.vmx手工清除方法(针对病毒变种补充完整)
- JAVA 函数的重载
- BAT算法工程师的成长之路,超详细的学习路线
- 神雕侠侣服务器维修,《神雕侠侣》2019年6月13日更新维护新服开启公告
- Android实现MP4边下边播(边缓存边播放、在线播放)原理与代码
- 种草功能在电商app源码中发挥的作用和价值
- linux命令界面切换桌面,Linux图形界面和命令行界面切换
- DS18B20的使用介绍
- 《论文写作》课堂收获
- MySQL——数据库锁原理
- 创造与魔法服务器维护后必刷鸟吗,创造与魔法云斑鹦鸟位置必刷点2020 刷新时间和地点介绍...