首页 > 代码库 > OC加强 内存管理

OC加强 内存管理

1 . 基本方法使用

1> retain : 计数器 + 1 , 会返回对象本身

2> release : 计数器 - 1 , 没有返回值

3> retainCount : 获取当前的计数器

4> dealloc

    * 当一个对象要背回收的时候, 就会调用

    * 一定要调用[super dealloc] , 这句调用要放在最后面

 

2.概念

 1>僵尸对象 : 所占用内存已经被回收的对象, 僵尸对象不能再使用

 2>野指针 : 指向僵尸对象 (不可用内存) 的指针

 3>空指针 : 没有指向任何东西的指针(存储的东西是nil, NULL , 0 ) , 给空指针发送消息不会报错

 

注意:

1 . 想使用(占用) 某个对象 , 就应该让对象的计数器+1 (retain操作)

 2 . 不想使用(占用) 某个对象 , 就让对象的计数器 -1 (release操作)

 3 . 谁 retain , 谁 release

 4 . 谁 release , 谁 release

 

 

内存管理代理规范

 1.只要调用alloc , 必须有 release (autorelease)

 

 2.set方法的代码规范

 1>基本数据类型 :直接复制

 -(void)setAge:(int)age

 {

 _age = age;

 }

 

 2> OC对象类型

 - (void)setCar:(Car*)car

 {

     // 1. 先判断是不是新传进来的对象

     if( car != _car)

     {

         // 2. 对旧对象做一次release

         [ _carrelease ];     // 第一次调用为 nil

        

         // 3. 对新对象做一次retain

         _car = [carretain];

     }

 }

 

 3 . dealloc 方法的代码规范

 1> 一定要调用[super dealloc] , 而且要放到最后面

 2> 对self(当前对象) 所拥有的其他对象做一次release

 - (void)dealloc

 {

        [ _carrelease];

        [ superdealloc];

 }

 

   ARC automaticReference Counting 自动引用计数

 

   ARC 编译器特性

       编译器会在适当时候,加入内存管理的代码

 

   强指针:默认所有的指针都是强指针

          只要是有强指针指向一个对象,那么这个对象就不会被释放

          只要是没有强指针指向一个对象,那么这个对象就被立即回收

          __strong 强指针标示,但是默认所有指针都是强指针,所以他没有用

   弱指针:弱指针指向的对象不影响对象回收

   注意:不要用弱指针指向一个刚刚创建出来的对象

 

   当出现循环引用的时候,必须要由一端是弱指针

----------------------------------------------------------------------------


案例 :

#import <Foundation/Foundation.h>

#import "CZPerson.h"

/*

   如果内存管理不当

   1、不再使用对象没有被回收,内存泄露,最终导致程序闪退

   2、正在被使用对象被释放了,野指针,访问野指针就会导致程序崩溃

 

   ARC  Automatic Reference Counting     自动引用计数

   MRC  Manual Reference Counting   手动引用计数

 

   1、当一个对象刚刚出生时候,它的引用计数 1

   2、当对象上引用计数是0的时候,系统立即把它回收

 

   3、release  引用计数-1

   4、retain   引用计数+1


int main(int argc, const char * argv[]) {

 

    CZPerson *person =[[CZPerson alloc] init];//1

   

    long count  = [person retainCount];

    NSLog(@"%zd",count);

   

    [person retain];//2

    NSLog(@"%zd",[personretainCount]);

    [person release];//0

   

    NSLog(@"%zd",[personretainCount]);

    [person release];

   

//    person = nil;

//  当一个指针指向 nil,这个指针我称为空指针

//  给空指针发送消息系统不会报错,它什么都不做

    [person test];

   

    [person dealloc];

   

   

    NSLog(@"%zd",[personretainCount]);//

   

    return 0;

}


#import <Foundation/Foundation.h>

@interface CZPerson : NSObject

 

- (void) test;

 

@end

 

@implementation CZPerson

  

- (void) test

{

    NSLog(@"CZPerson");

}

 

//永远不要试图自己调用这个方法

-(void) dealloc

{

//   这里可以验证对象是否被回收了

   

    NSLog(@"CZPerson回收");

   

//  这个方法中必须调用父类该方法,并且必须放在最后

    [super dealloc];

}

@end

 



OC加强 内存管理