zoukankan      html  css  js  c++  java
  • 关于Objective-C 对象release操作的一个小问题探讨

    来源:http://blog.csdn.net/duxinfeng2010/article/details/8757211

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



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

    1. - (void)viewDidLoad  
    2. {  
    3.     [super viewDidLoad];  
    4.       
    5.     Test *testObj = [[Test alloc] init];  
    6.     NSLog(@"release 前 %d",[testObj retainCount]);  
    7.     [testObj release];  
    8.     NSLog(@"release 后 %d",[testObj retainCount]);  
    9.       
    10. }  



    明明release了,retainCount计数应该为0,但是 为什么retainCount计数还是1,当我们release操作两次的时候程序就崩溃了;


    然后我们打印一下testObj对象

    1. - (void)viewDidLoad  
    2. {  
    3.     [super viewDidLoad];  
    4.       
    5.     Test *testObj = [[Test alloc] init];  
    6.     NSLog(@"release 前 %d",[testObj retainCount]);  
    7.   
    8.     NSLog(@"testObj  release指向-->%@",testObj);  
    9.       
    10.     [testObj release];  
    11.   
    12.     NSLog(@"release 后 %d",[testObj retainCount]);  
    13.       
    14.     NSLog(@"testObj  release指向-->%@",testObj);  
    15.       
    16.       
    17. }  



    发现他们指向同一块地址;

    testObj 在alloc的时候在堆上申请到一片空间,然后它的retainCount计数为1,然后我们release之后,testObj指向的空间被销毁了,不 存在了。此时testObj就是一个野指针了;此时我们调用[testObj retainCount]就属于一个不安全的做法;


    然后我们在添加一行代码,[testObj release]之后,添加 testObj = nil;

    1. - (void)viewDidLoad  
    2. {  
    3.     [super viewDidLoad];  
    4.       
    5.     Test *testObj = [[Test alloc] init];  
    6.     NSLog(@"release 前 %d",[testObj retainCount]);  
    7.     NSLog(@"testObj  release指向-->%@",testObj);  
    8.     [testObj release];  
    9.     testObj = nil;  
    10.     NSLog(@"release 后 %d",[testObj retainCount]);  
    11.     NSLog(@"testObj  release指向-->%@",testObj);  
    12.       
    13.       
    14. }  



    唉,看到这里就应该明白了 吧,[testObj release] 后,testObj仍有指向,只是testObj原来指向的那片空间已被销毁,但是本身还存在,通过置为nil这一步操作,就不在指向原来那片地址;应该 记起viewDidUnload函数作用了吧,它就是干这个活的,我们申明一个对象属性的时候,在viewDidUnload中将这个属性置为nil这一 步操作;


  • 相关阅读:
    前端之CSS1
    前端之HTML
    Python进阶之网络编程
    SparkSQL——HiveContext的使用
    SparkSQL——SQLContext的使用
    语义分析
    SLR(1)分析法分析过程
    算符优先分析法
    LL(1)语法分析
    递归下降分析分析法
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3471082.html
Copyright © 2011-2022 走看看