zoukankan      html  css  js  c++  java
  • [转]一个小试验验证对象的指针计数置为nil的情况

    本文转载于新风作浪的博客专栏,博客地址: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这一步操作;

    提醒:在ios6.0之后viewDidUnload这个方法已经弃用了,那么在哪里将属性置为nil哇,我现在是很纠结是否在dealloc释放和置属性为nil的。 不知道网友们是怎么做的

    个人小结下:看这结果似乎是原对象释放,但是没有置为nil的时候原对象请求的空间因为有这个指针指着计数仍然为1,而只有在置为nil之后才会释放的样子。0.。0

    不知道是不是这样子说。。

  • 相关阅读:
    npm 设置淘宝镜像
    JS字符串首字母大写
    类与面向对象基础(三)
    (转)php简单工厂模式实例讲解
    类与面向对象基础(二)
    类与面向对象基础(一)
    php连接数据库
    php中使用指针进行函数操作
    PHP基础之数组
    PHP正则表达式
  • 原文地址:https://www.cnblogs.com/ios-wmm/p/3247913.html
Copyright © 2011-2022 走看看