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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 远人 中级黑马   /  2014-4-20 15:03  /  925 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 远人 于 2014-4-20 15:06 编辑

  1. <font color="#000000">#import <Foundation/Foundation.h>

  2. @interface Person : NSObject

  3. @property int age;
  4. - (void)dealloc;

  5. @end

  6. #import "Person.h"

  7. @implementation Person
  8. - (void)dealloc
  9. {
  10.     NSLog(@"Person对象被回收了");
  11.     [super dealloc];
  12. }

  13. @end

  14. #import <Foundation/Foundation.h>
  15. #import "Person.h"

  16. int main(int argc, const char * argv[])
  17. {
  18.     Person *p = [[Person alloc] init];
  19.    
  20.     NSUInteger n = [p retainCount];
  21.    
  22.     NSLog(@"%ld",n);
  23.    
  24.     //2
  25.     [p retain];
  26.    
  27.     NSInteger n2 = [p retainCount];
  28.    
  29.     NSLog(@"%ld",n2);
  30.     //1
  31.     [p release];
  32.     //0
  33.     [p release]; //在老师的讲解中,此处Person对象的计数器为0 ,就应该回收Person对象,
  34.    
  35.    
  36. //    [p release];
  37.    
  38.     [p retain];//此处,再进行retain操作就应该报错,这是对野指针进行操作,但是运行不但没有错误,后面检验的计数器显示居然为2,这是什么原因?
  39.    
  40.    
  41.     NSInteger n3 = [p retainCount];
  42.    
  43.     NSLog(@"%ld",n3);
  44.    
  45.     return 0;</font>
复制代码
这段代码是关于野指针的,问题的细节我在代码中又详细询问,这究竟是什么原因?
}

评分

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

查看全部评分

2 个回复

倒序浏览
马凯文 发表于 2014-4-20 18:23
你把所有的去掉就好了!

苹果官方文档有说明,不要调用retainCount 。它不可以作为调试的依据,因为内存管 ...

恩,看了,总结这句话最有用:当release对象后,其retain count计数如果为0,建议nil一次,对其所指内容进行一次清空。

谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马