最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的

然后写了这样一小段程序,运行

- (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操作的一个小问题探讨相关推荐

  1. C语言操作MySQL-----又一个小技巧

    C语言操作MySQL 连接MySQL 常用数据库操作函数 查询操作 1.`mysql_query()`函数 插入操作 修改操作 删除操作 在开始之前需要进行环境的配置,请参考这篇博客: VS2019配 ...

  2. 实践操作:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器

    TensorFlow对象检测API是一个建立在TensorFlow之上的开源框架,可以轻松构建,训练和部署对象检测模型. 到目前为止,API的性能给我留下了深刻的印象.在这篇文章中,我将API的对象设 ...

  3. DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为(转)...

    一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来. 首先,DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢 ...

  4. tfr 计算机硬件,实践操作:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器...

    TensorFlow对象检测API是一个建立在TensorFlow之上的开源框架,可以轻松构建,训练和部署对象检测模型. 到目前为止,API的性能给我留下了深刻的印象.在这篇文章中,我将API的对象设 ...

  5. jQuery 1.6 源码学习(六)——core.js[6]之jQuery对象/数组操作相关方法

    本文将分析jQuery对象操作相关方法(包括静态和实例方法): merge方法,代码如下: //此方法用于合并两个jQuery对象(因为jQuery对象中有length属性)或者数组,//这个方法非常 ...

  6. Java中的对象序列化操作

    文章目录 1 Java中的对象序列化操作 1 Java中的对象序列化操作 首先看一下对象序列化的操作步骤: 创建一个类,继承Serializable接口 创建对象 将对象写入文件 从文件读取对象信息 ...

  7. python实现文件管理系统_Python使用文件操作实现一个XX信息管理系统的示例

    大家好,我是第一次python学了一个学期,期末要完成一个毕业生信息管理系统大作业的小韩了,由于上次没有仔细看开发实现的要求,实现了一个简单的毕业生信息管理系统,而这次专门整理了两种使用文件进行保存数 ...

  8. unity双击打不开脚本_游戏对象和脚本 (创建一个时钟)

    该文章是一篇译文,附上原文链接 Game Objects and Scripts​catlikecoding.com 使用简单对象构建一个时钟 编写一个C#脚本 转动时钟的指针来显示时间 创建指针动画 ...

  9. JavaScript(Dom对象的操作)

    Dom对象的操作 核心 doucument 获得Dom节点 更新节点 实战演练 删除Dom节点 插入节点 把已有的标签进行插入 创建一个新的标签,实现插入 在子节点前插入(insertBefore) ...

最新文章

  1. 如何利用微信小游戏的分包加载机制突破4M代码包体积限制
  2. POJ2762 Going from u to v or from v to u? 强连通+缩点
  3. android 系统的切图方式_UI设计切图规范
  4. ArtRage中文版
  5. 有 OC 经验的程序员快速学习 Swift 语法
  6. leetcode 208. Implement Trie (Prefix Tree) | 208. 实现 Trie 前缀树(Java)
  7. 华为杯数学建模2020获奖名单_我校在2020年全国大学生数学建模竞赛中再获佳绩(内附获奖名单)...
  8. 【Clickhouse】Clickhouse 整合 Prometheus 监控 运行时状态
  9. vivado 如何创建工程模式_用Tcl定制Vivado设计实现流程
  10. 转:jwgkvsq.vmx手工清除方法(针对病毒变种补充完整)
  11. JAVA 函数的重载
  12. BAT算法工程师的成长之路,超详细的学习路线
  13. 神雕侠侣服务器维修,《神雕侠侣》2019年6月13日更新维护新服开启公告
  14. Android实现MP4边下边播(边缓存边播放、在线播放)原理与代码
  15. 种草功能在电商app源码中发挥的作用和价值
  16. linux命令界面切换桌面,Linux图形界面和命令行界面切换
  17. DS18B20的使用介绍
  18. 《论文写作》课堂收获
  19. MySQL——数据库锁原理
  20. 创造与魔法服务器维护后必刷鸟吗,创造与魔法云斑鹦鸟位置必刷点2020 刷新时间和地点介绍...

热门文章

  1. Linux-定时任务(Crontab)基本用法
  2. 软件测试工作中的沟通问题
  3. Android记录日志方式,关于Android中处理崩溃异常和记录日志的另一种实现思路
  4. python美股财务数据曝光_python实现美股日k线数据获取
  5. 软引用和弱引用的应用场景
  6. 场论 梯度 旋度 散度
  7. solve det(I + uv^t)
  8. pycharm下的第一个函数程序
  9. 【java】输入球的半径,求出其体积
  10. java p=x,javap的简单理解