Objective-c的内存管理方式

来源:互联网 发布:消防联动逻辑编程自学 编辑:程序博客网 时间:2024/06/05 14:56

Objective-c中提供了三种内存管理方式.

1.GC(Garbage Collection) 垃圾回收
2.MRC(Manual Reference Counting) 手动引用计数
3.ARC(Automatic Reference Counting) 自动引用计数

  一. GC: 程序员只需要开辟内存空间, 不需要用代码显示地释放, 系统来判断哪些空间不再被使用, 并且回收这些内存空间, 以便再次分配. 由系统自动完成垃圾回收. OS有垃圾回收机制, 但IOS没有垃圾回收机制. 

二. MRC: 内存的开辟和释放都由程序员用代码进行手动控制. 特点: 相对垃圾回收来说, 对内存的控制的要求较高, 程序员要熟悉内存管理的机制. MRC是IOS管理内存的基本机制. 

三. ARC: IOS 5.0编译器特性, 只允许程序员开辟空间, 不用释放空间.  ARC不是垃圾回收, 它的本质是MRC, 只是编译器帮程序员默认加了释放的代码.

MRC和ARC

内存管理机制:

C语言中, 使用malloc和free进行堆内存的创建和释放. 即堆内存只有正在使用和销毁两种状态. 实际开发中, 可能会遇到两个以上的指针使用同一块内存. C语言无法记录内存使用者的个数.
OC用引用计数(retain count) 记录某块内存持有者的个数.

        /*引用计数 retain count*/

        //1. 指向: 保存内存地址

        //2. 持有: alloc, retain

        Person *xuJiYao = [[Personalloc] init];

        NSLog(@"xuJiYao:%lu", [xuJiYaoretainCount]);    

        Person *tuTuTu = xuJiYao;

        [tuTuTu retain];

        NSLog(@"tuTuTu:%lu", [tuTuTuretainCount]);      

        //3. 释放

        [xuJiYao release];//引用计数减1

        xuJiYao = nil;    //防止野指针  

        NSLog(@"%lu", [tuTuTuretainCount]);

        [tuTuTu release];//引用计数减1  

       //4. 回收:系统自动调用dealloc方法 当一个引用计数为0,系统自动调用 可以使用 

        NSLog(@"%lu", [tuTuTuretainCount]);

       //retaincount 和方法实现有关我们看不到 这个方法不准使用辅助调试 但不是重要的依据

        tuTuTu = nil;     //防止野指针


注:

   //野指针

        //1. 指向访问受限的区域

        int *p = 0x00001//不要指向固定地址 保证初始化

        NSLog(@"%d", *p);

        

        //2.指向一个已经被释放的区域

        int *q = malloc(sizeof(int));

        *q = 5;

        free(q);

        //q:变成野指针已经被释放 可以用,但是可以用,被覆盖了,才会改变值

        NSLog(@"%d", *q);


影响引用计数的方法:

+ alloc      //开辟内存空间,引用计数由0变为1 

- retain    //主张对象持有权,引用计数累加1

- release   //释放对象,不再持有,引用计数减1

- autorelease//自动释放对象,引用计数未来减1 

- copy //拷贝创建一个对象,原有对象引用计数不变

内存管理原则:

英文: 

You own any object youcreate by allocating memory for it or copying it.Related methods:alloc,allocWithZone:,copy,copyWithZone:,mutableCopy,mutableCopyWithZone:

•If you are not the creator of an object, but want toensure it stays in memory for you to use, you canexpress an ownership interestin it. Related method: retain

•If youown an object, either by creating it orexpressing an ownership interest, you are responsible forreleasing it when you no longer need it.Related methods:release,autorelease

Conversely, if you are not the creator of an object and have not expressed an ownership interest, you must not release it.

解释: (白话)

/*内存管理原则*/

        //1.谁创建谁持有 创建的时候引用计数为1

        //2.如果这个对象不是你创建的 你也指向这个对象retain对他的引用计数加1

        //3. 如果你持有一个对象, 你不在使用时, 你就有责任用release autorelease给释放

        //4.如果你没有持有, 只是单纯的指向,你不能去释放它      

        //对其释放多了,就会出现野指针  加的次数与减得次数必须持平

归结: 内存空间的引用计数的增加和减少相等. 

增加: alloc retain copy

减少: release autorelease

引用计数为0后, 系统回收内存空间. 不可以在使用这块内存.



        



 

0 0