黑马程序员技术交流社区

标题: 关于引用计数器的一点问题 [打印本页]

作者: 陨石    时间: 2014-11-10 11:25
标题: 关于引用计数器的一点问题
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??????
作者: 陨石    时间: 2014-11-10 11:26
都被回收了,为什么还是输出1呢
作者: 胡胡胡胡胡    时间: 2014-11-10 14:31
我刚学iOS。   
在你后边两次release操作后  p指向的person对象为僵尸对象,这样再对p进行 retainCount操作不会发生野指针错误么?
作者: 陨石    时间: 2014-11-10 15:12
没报啊。。。可能是认为错误的指向也是指向吧。。。。。
作者: yuanlingqi    时间: 2014-11-10 15:14
晚上回去帮你看看
作者: 邵起    时间: 2014-11-13 08:22
楼主,我就想问一下,你粘贴的代码图片是用神马编辑器做的,直接可以复制粘贴文本,好高端的样子,我怎么不会,怎么弄呀?





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