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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jiangenhao 中级黑马   /  2014-5-14 23:13  /  1077 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. void arrayMemory() {
  2.     // 1
  3.     Student *stu1 = [[Student alloc] init];
  4.     Student *stu2 = [[Student alloc] init];
  5.     Student *stu3 = [[Student alloc] init];
  6.    
  7.     NSLog(@"stu1:%zi", [stu1 retainCount]);
  8.    
  9.     // 当把一个对象塞进数组中时,这个对象的计数器会加1,也就是说数组会对它做一次retain操作
  10.     // 2
  11.     NSArray *array = [[NSArray alloc] initWithObjects:stu1, stu2, stu3, nil];
  12.     NSLog(@"arrayretaincount=%zi", [array retainCount]);
  13.     NSLog(@"stu1:%zi", [stu1 retainCount]);

  14.     NSLog(@"arraycount=%zi", array.count);
  15.     NSLog(@"arrayretaincount=%zi", [array retainCount]);
  16.    
  17.     // 1
  18.     [stu1 release];
  19.     [stu2 release];
  20.     [stu3 release];
  21.     NSLog(@"arrayretaincount=%zi", [array retainCount]);
  22.     // 数组被销毁的时候,会对内部的所有元素都做一次release操作
  23.     // 0
  24.    
  25.     [array release];
  26. //    [array release];
  27.      NSLog(@"arrayretainCount=%zi", [array retainCount]);
  28. }
复制代码


为什么最后一次[array retainCount]输出结果为1?
我调用了     [array release]; 应该把array销毁了 array应该不存在了 我打印出来结果却依然为1

2 个回复

倒序浏览
虽然打印是1,但是对象已经被销毁了,你可以在delloc中查看,是否被销毁。
除非你将其赋值为nil会打印0之外,release到最后都是1.
  1. @implementation Student
  2. - (void)dealloc {
  3.     NSLog(@"DASD");
  4.     [super dealloc];
  5. }
  6. @end
  7. int main(int argc, const char * argv[])
  8. {
  9.     Student *stu = [[Student alloc] init];
  10.     [stu release];
  11.     NSLog(@"%zi", [stu retainCount]);  //打印1,但是已经对象已经被销毁了
  12.     return 0;
  13. }
复制代码
回复 使用道具 举报
一只小菜鸟 发表于 2014-5-15 13:07
虽然打印是1,但是对象已经被销毁了,你可以在delloc中查看,是否被销毁。
除非你将其赋值为nil会打印0之外 ...

为何计数器不为0,对象会被销毁呢? 不是只有计数器为0,对象才会销毁嘛,求解释
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马