黑马程序员技术交流社区

标题: 野指针相关? [打印本页]

作者: 远人    时间: 2014-4-20 15:03
标题: 野指针相关?
本帖最后由 远人 于 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>
复制代码
这段代码是关于野指针的,问题的细节我在代码中又详细询问,这究竟是什么原因?
}

作者: 远人    时间: 2014-4-20 21:54
马凯文 发表于 2014-4-20 18:23
你把所有的去掉就好了!

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

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

谢了




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