关于Objective-C 对象release操作的一个小问题探讨
来源:http://blog.csdn.net/duxinfeng2010/article/details/8757211
最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的

然后写了这样一小段程序,运行
- - (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这一
步操作;
关于Objective-C 对象release操作的一个小问题探讨的更多相关文章
- 为什么使用eval()将json字符串转换为对象要多加一个小括号
使用eval()将json字符串转换为对象要多加一个小括号: 关于eval()函数的具体用法这里就不多介绍了,具体可以参阅javascript的eval()方法一章节,下面就介绍一下为什么使用eval ...
- DOM操作的一个小坑
最近在苦读<JavaScript高级程序教程>,真不愧是前端圣经,学到了很多东西. nodeList.NameNodeMap.HTMLCollection这三个集合是动态的!每当文档发生变 ...
- DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢,而是说操作了这个对象后,会触发一些浏览器行为(转)
一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来. 首先,DOM对象本身也是一个js对象,所以严格来说,并不是操作这个对象慢 ...
- [转]一个小试验验证对象的指针计数置为nil的情况
本文转载于新风作浪的博客专栏,博客地址:http://blog.csdn.net/duxinfeng2010/article/details/8757211 以下博客原文: 最近遇到这样一个问题,以前 ...
- jQuery对象的操作
参考一篇不错的文章:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object 1. ...
- Javascript对象赋值操作
首先,我们还是举个例子来说明对象赋值操作的问题吧: ps: 本文默认约定log = console.log function A(){} A.prototype.x = 10; var a1 = ne ...
- java操作xml的一个小例子
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...
- string 对象及其操作
标准库类型string 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件.作为标准库的一部分,string定义在命名空间std中.接下来的示例都假定了已包 ...
- 关于DOM中的model(将元素转成对象进行操作)
DOM document (html, xml) object 将文档中的HTML元素转成js的对象 通过ID找到文档的元素转成js对象 var obj = document.getElementBy ...
随机推荐
- Softmax回归(使用tensorflow)
# coding:utf8 import numpy as np import cPickle import os import tensorflow as tf class SoftMax: def ...
- 转载——Python模拟登录代码
''' Created on 2014-2-20 @author: Vincent ''' import urllib.parse import gzip import json import re ...
- MongoDB 入门与实例
一.准备工作 1. 下载mongoDB 下载地址:http://www.mongodb.org/downloads 选择合适你的版本 相关文档:http://www.mongodb.org/displ ...
- DW(五):polybase集群安装
目录: Prerequisites 集群配置规划 polybase install firewall config 集群配置 删除计算节点 install Prerequisites Microsof ...
- 【转】ODBC、OLE DB、 ADO的区别
一.ODBC ODBC的由来 1992年Microsoft和Sybase.Digital共同制定了ODBC标准接口,以单一的ODBC API来存取各种不同的数据库.随后ODBC便获得了许多数据库厂商和 ...
- RDO部署openstack(2)
配置ML2和VXLAN 1. 安装和配置Neutron ML2 框架 (1) 安装在控制节点上(运行Neutron-server的节点) service neutron-server stop y ...
- 【1-4】jQuery代码风格-导航栏
实现一个导航栏,单机不同的商品名称链接,显示相应的内容,同时高亮显示当前选择的商品. 实现功能如图: css: /* reset */ ;padding:0 0 12px 0;font-size:12 ...
- Linux下编译LibCURL
编译环境 操作系统: Red Hat Enterprise Linux Server release 5.4 64-bit 编译工具: gcc (GCC) 4.1.2 20080704 (Red Ha ...
- 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】
基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...
- bzoj1173: [Balkan2007]Point
Description 给出N个三维空间上的点. 问有多少条直线,这些直线上至少有三个点. Input 第一行给出数字N,N在[4,1000] 下面N行,每行三个数字,用于描述点的坐标,其值在[-10 ...