A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cnchenys 中级黑马   /  2014-3-31 09:40  /  1703 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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方法了啊,已经销毁了啊???

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

3 个回复

倒序浏览
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);试一试就知道了,肯定报错。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
脸皮猴 发表于 2014-3-31 11:31
1、你检查下你的dealloc重写方法里面super dealloc没有。

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

猴哥威武
回复 使用道具 举报
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会发生野指针错误,因为访问了一块已经被释放的空间。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马