• 关于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这一 步操作;


  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3471082.html
Copyright © 2020-2023  润新知