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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陨石 高级黑马   /  2014-11-10 11:25  /  1712 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

main.m
  1. #import <Foundation/Foundation.h>
  2. #import "Person.h"

  3. int main(int argc, const char * argv[]) {
  4.     @autoreleasepool {
  5.         // insert code here...
  6.         NSLog(@"Hello, World!");
  7.         //调用引用计数器 alloc计数器加1
  8.         Person *p = [[Person alloc]init];
  9.         //类型不匹配需要强转int a = (int),或是使用匹配类型NSInteger
  10.         int a = (int)[p retainCount];
  11.         NSInteger b =[p retainCount];
  12.         NSLog(@"p retainCount 1:%d,%ld",a,b);
  13.         
  14.         //发送release引用计数器减一,减为零时,对象回收
  15.         //验证对象是否回收,重写-dealloc
  16.        // [p release];
  17.         //给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)
  18.         //当对象被回收时,再发送retain就不对了。
  19.         [p retain];
  20.         b =[p retainCount];
  21.         NSLog(@"p retainCount 2:%d,%ld",a,b);
  22.         [p release];
  23.         [p release];
  24.         b =[p retainCount];
  25.         NSLog(@"p retainCount 3:%d,%ld",a,b);
  26.     }
  27.     return 0;
  28. }
复制代码

Person.h
  1. #import <Foundation/Foundation.h>

  2. @interface Person : NSObject

  3. @end
复制代码

Person.m
  1. #import "Person.h"

  2. @implementation Person
  3. //当一个Person对象被回收时自动调用这个方法
  4. - (void)dealloc
  5. {
  6.    
  7.     NSDate *currDate=[NSDate date];//先获取当前时间
  8.     //以下两行是创建一个格式化工具,先初始化一个时间格式,然后定义这个格式
  9.     NSDateFormatter *dateFormate=[[NSDateFormatter alloc]init];
  10.     [dateFormate setDateFormat:@"yyyy/MM/dd HH:mm:ss:SSS"];
  11.     //利用上面的时间格式工具把日期转换成字符串对象格式
  12.     NSString *dateStr=[dateFormate stringFromDate:currDate];
  13.    
  14.     NSLog(@"Person 回收了 time:%@",dateStr);
  15.    
  16.     //一定要调用父类的回收方法,而且要放在最后面
  17.     [super dealloc];
  18. }
  19. + (void)load
  20. {
  21.     NSDate *currDate=[NSDate date];//先获取当前时间
  22.     //以下两行是创建一个格式化工具,先初始化一个时间格式,然后定义这个格式
  23.     NSDateFormatter *dateFormate=[[NSDateFormatter alloc]init];
  24.     [dateFormate setDateFormat:@"yyyy/MM/dd HH:mm:ss:SSS"];
  25.     //利用上面的时间格式工具把日期转换成字符串对象格式
  26.     NSString *dateStr=[dateFormate stringFromDate:currDate];
  27.    
  28.     NSLog(@"Person load time:%@",dateStr);
  29. }
  30. @end
复制代码
  1. 控制台输出:
  2. 2014-11-09 19:21:44.118 01引用计数器[795:303] Person load time:2014/11/09 19:21:44:110
  3. 2014-11-09 19:21:44.119 01引用计数器[795:303] Hello, World!
  4. 2014-11-09 19:21:44.119 01引用计数器[795:303] p retainCount 1:1,1
  5. 2014-11-09 19:21:44.120 01引用计数器[795:303] p retainCount 2:1,2
  6. 2014-11-09 19:21:44.121 01引用计数器[795:303] Person 回收了 time:2014/11/09 19:21:44:121
  7. 2014-11-09 19:21:44.121 01引用计数器[795:303] p retainCount 3:1,1
  8. Program ended with exit code: 0
复制代码

为什么最后一次输出计数器的时候输出的是1而不是0??????

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

5 个回复

倒序浏览
都被回收了,为什么还是输出1呢
回复 使用道具 举报
我刚学iOS。   
在你后边两次release操作后  p指向的person对象为僵尸对象,这样再对p进行 retainCount操作不会发生野指针错误么?
回复 使用道具 举报
没报啊。。。可能是认为错误的指向也是指向吧。。。。。
回复 使用道具 举报
晚上回去帮你看看
回复 使用道具 举报
楼主,我就想问一下,你粘贴的代码图片是用神马编辑器做的,直接可以复制粘贴文本,好高端的样子,我怎么不会,怎么弄呀?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马