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

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

  • 相关阅读:
    优先队列
    Problem W UVA 662 二十三 Fast Food
    UVA 607 二十二 Scheduling Lectures
    UVA 590 二十一 Always on the run
    UVA 442 二十 Matrix Chain Multiplication
    UVA 437 十九 The Tower of Babylon
    UVA 10254 十八 The Priest Mathematician
    UVA 10453 十七 Make Palindrome
    UVA 10163 十六 Storage Keepers
    UVA 1252 十五 Twenty Questions
  • 原文地址:https://www.cnblogs.com/ios-wmm/p/3247913.html
Copyright © 2011-2022 走看看