黑马程序员技术交流社区

标题: 内存释放的问题求助 [打印本页]

作者: cnchenys    时间: 2014-3-31 09:40
标题: 内存释放的问题求助
本帖最后由 cnchenys 于 2014-3-31 15:27 编辑

        C * c2 = [[C alloc]init];
        c2.test1 = @"whatever";
        NSLog(@"%@",c2.test1);
        [c2 release];
        NSLog(@"%lu",(unsigned long)c2.retainCount);
        [c2 release];
        NSLog(@"%@",c2.test1);

打印结果:

2014-03-30 15:29:36.936 MemoryTest[1529:707] whatever
2014-03-30 15:29:36.938 MemoryTest[1529:707] delloc C
2014-03-30 15:29:36.939 MemoryTest[1529:707] 1
2014-03-30 15:29:36.939 MemoryTest[1529:707] whatever

他为什么不报错啊,c2 不是释放了吗???而且已经调用dealloc方法了啊,已经销毁了啊???
作者: 脸皮猴    时间: 2014-3-31 11:31
1、你检查下你的dealloc重写方法里面super dealloc没有。

2、我刚刚测试了下,release以后这个内存不是马上就释放了,而是还需要时间的。你下面这两句
2014-03-30 15:29:36.939 MemoryTest[1529:707] 1
2014-03-30 15:29:36.939 MemoryTest[1529:707] whatever
能打印出来可能是内存还没真正的释放,你多打印几句这个   NSLog(@"%@",c2.test1);试一试就知道了,肯定报错。

作者: cnchenys    时间: 2014-3-31 12:48
脸皮猴 发表于 2014-3-31 11:31
1、你检查下你的dealloc重写方法里面super dealloc没有。

2、我刚刚测试了下,release以后这个内存不是马 ...

猴哥威武
作者: 于清扬    时间: 2014-3-31 14:17
C * c2 = [[C alloc]init];
        c2.test1 = @"whatever";
        NSLog(@"%@",c2.test1);
        [c2 release];
        NSLog(@"%lu",(unsigned long)c2.retainCount);
        [c2 release];
        NSLog(@"%@",c2.test1);
从上面的代码看,存在内存管理的问题。
一个对象通过alloc 创建出来引用计数器是1,release一次计数器减1,
重写dealloc方法,调回super dealloc 。
上面代码第一次release后计算器是0,对象会被释放,在调用release会发生野指针错误,因为访问了一块已经被释放的空间。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2