代码改变世界

内存管理

2015-08-25 10:38  TemptationM  阅读(79)  评论(0)    收藏  举报
一:
1. retain release方法的基本使用
2.retain计数器加1  会返回对象本身
3.  release计数器减1  没有返回值
4.retainCount  :获取当前计数器
5.dealloc
     * 当一个对象要被回收的时候,就会调用
     *一定要调用[super dealloc]  且这句调用要放在最后面
 
 
person *p =[person alloc] init];
NSUInteger c = [p  retainCount];
NSLog(@“%ld“, c );    打印此时的计数器
 
- (void)dealloc  //当一个对象被回收的时候, 就会自动调用这个方法
{
     NSLog(@“对象被回收”);
//super的dealloc一定要调用. 而且放在最后面
     [super dealloc];
}
 
 
 
2. 野指针. 僵尸对象
僵尸对象:计数器变为0后的对象成为僵尸对象
野指针: 指向僵尸对象. (不可用内存)的指针      (给野指针发送消息会报错)
空指针: 没有指向任何东西的指针 (存储的东西是nil, NULL ,  0)    给空指针发送消息不会报错
 
3. retain方法是有返回值的, 会返回对象本身      相当于:   [p  retain] == p
 
经典报错:EXC_BAD_ACCESS:  访问了一块坏得内存(已经被回收, 已经不可用的内存)
 
 
二:
1. 你想使用(占用)某个对象, 就要你应该让对象计数器+! (让对象做一次retain操作)
2. 你不想再使用(占用)某个对象. 就应该让对象的计数器-1. (让对象做一次release)
3. 谁retain, 谁release
4. 谁alloc, 谁release
 
 
 
 
 
 
 
三:
内存管理代码规范:
1. 只要调用了alloc, 必须有release( autorelease)
     如果对象不是通过alloc产生的, 就不需要release
 
2. set方法的代码规范:
1> 基本数据类型: 直接赋值
    - ( void) setAge: (int)age
     {
          _age = age;
     } 
 
 
   2> OC对象类型
     - (void)setCar : (Car *) car
     {
          //1. 先判断是不是新传进来的对象
          if (car != car)
          {
               //2. 对旧对象做一次release
                    [_car  release];
 
               //3. 对新对象做一次retain
                    _car = [car retain];
          }
     }
 
3. deallob 方法的代码规范
1> 一定要[super dealloc], 而且放到最后面
2>  对self(当前)  所拥有的其他对象做一次release
     - (void)dealloc
     {
          [_car release];
          [super dealloc];
     }
 
 
一. autorelease方法的基本用法:
1>  autorelease方法会返回对象本身
2> 调用autorelease方法后, 对象改的计数器不变
3>  autorelease会将对象放到一个自动释放池中
4> 当自动释放池被销毁时, 会对池子里面的所有对象做一次release操作
 
二. autorelease的好处:
1> 不用再关心对象释放的时间
2> 不用再关心什么时候调用release
 
三. autorelease的使用注意
1> 占用内存较小的对象不要随便使用autorelease
2> 占用内存较小的对象使用autorelease, 没有太大影响
 
四 错误写法
1> alloc之后调用了autorelease, 又调用了release
2> 连续调用多次autorelease
 
五 自动释放池
1> 在iOS程序运行过程中, 会创建无数个池子. 这些池子都是以栈结构存在(先进后出)
2> 当一个对象调用autorelease方法时. 会将这个对象放到栈顶的释放池
 
六 自动释放池的创建方式
1> iOS5.0 前
NSAutoreleasePool *pool = [[NSAutoreleasePool  alloc] init];
[pool  release];
 
2> iOS5.0开始
@autorelease
{
 
}