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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

黑马程序员——oc语言学习心得—— 手动管理内存

------Java培训Android培训iOS培训.Net培训、期待与您交流------

首先要手动管理内存  要手动改以下参数 将yes改为no


内存管理原则

(一)原则

只要还有人在使用某个对象,那么这个对象就不会被回收;

只要你想使用这个对象,那么就应该让这个对象的引用计数器+1;

当你不想使用这个对象时,应该让对象的引用计数器-1;

(二)谁创建,谁release

(1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法

(2)不是你创建的就不用你去负责

(三)谁retain,谁release

只要你调用了retain,无论这个对象时如何生成的,你都要调用release

(四)总结

有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1.

单个对象内存管理
在MRC模式下 对象引用计数为0就会被释放  retain加1 release减1 retaincount查看引用计数
要检测对象是否被释放  要重写dealloc方法  最后要调用[super dealloc];
  1. -(void)dealloc{

  2.     NSLog(@"对象一挂掉,哈哈哈");
  3.     [super dealloc];

  4. }
复制代码

如果引用计数为0在使用此对象对造成野指针访问
  1. Person *p=[[Person alloc]init];//1
  2.         
  3.         NSUInteger i= [p retainCount];//1
  4.         NSLog(@"%lu",i);
  5.         //错误 NSUInteger a=[p retain];
  6.         //引用计数加1
  7.         Person *p2=[p retain];//2
  8.         NSUInteger a=[p2 retainCount];
  9.         NSLog(@"\n%lu",a);
  10.         //引用计数减1
  11.         [p release];//1
  12.         NSLog(@"retainCount=%lu",[p retainCount]);
  13.         [p release];//0//此时引用计数为0 系统自动调用我们重写的dealloc方法
  14.         //[p eat];//对象已挂 这是野指针访问 开启僵尸对象检测才会报错
  15.         //NSLog(@"retainCount=%lu",[p retainCount]);//野指针访问 以为对象已死 值没有意义n
复制代码

------Java培训Android培训iOS培训.Net培训、期待与您交流------

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马