IOS OC 内存管理

来源:互联网 发布:软件升级服务 增值税 编辑:程序博客网 时间:2024/06/07 10:02


 OC 内存管理

1、真机下,如果一个APP使用的内存超过30M,则系统会向该APP发送Memory Warning消息,收到此消息后APP必须正确处理,否则可能出错或者出现内存泄露甚至崩溃

  程序运行时的内存资源的是有限的,object-c语言所编写的程序要实例化对象

   对象是要占用内存的如果创建了对象(分配了内存),而不去释放这些对象所占的内存,将会发生内存泄露

   需要手动管理内存

 管理内存:1、分配内存

          2、释放内存

 在不需要这个对象的时候即使把这个对象释放掉就可以防止内存泄露(光分配不释放)

 怎样判断是否需要释放一个对象?

 答:引用计数:是判断一个对象是否存在的标准

    得到引用计数公式:对象名.retainCount

 什么样的数据需要手动管理内存?、

 答:基本数据类型(不能称之为对象,因为它只是一个单一的数据)不用手动管理内存 -> 系统会处理 ->

 int a = 10; ->不需要管理内存

 Person *person = [[Person alloc]init]; -> 需要管理内存

 除了基本数据类型都需要手动管理内存(需要程序员管理)->

 程序员开辟的内存属于分配到堆里

 系统自动分配的内存会到栈里

 内存管理的原则:谁分配谁释放

 retainCount引用计数>0的时候就是对象存在的时候 如果不大于0就表示这个对象已经被释放了

 

 生命周期

 1alloc创建之后对象就存在了

 2、具体对对象的操作

 3、释放对象

 

 引用计数是判断一个对象是否存在的标准(>0

 

 让引用计数加1的方法

 1alloc new 

 2retain保留引用计数

 3copy拷贝

 让引用计数减1的方法

 1release释放

 2autorelease延迟释放

 

 MRC:手动管理引用计数

 ARC:自动管理引用计数

 

 对象被释放的时候会调用一个销毁对象的方法 delloc ->销毁对象

 

有一个allocretaincopy就要有一个对应的release才能释放掉对象

 

 setter方法的内存管理

 - (void)delloc{

 [super delloc];

  [原来的变量(全局变量)  release];

 }

 - (void)set对象名:(类型)参数名{

 if(原来的变量  !=参数名){

 [原来的变量 release];

 原来的变量 = [参数名 retain];

 }

 }

 内存管理原则:谁分配谁释放

 有一个allocretaincopy就要有一个对应的release  autorelease才能释放掉对象

 

 copy 会产生一个新的而对象

 retain是保留引用计数给(原来)对象引用计数+1只要有一个引用计数为0这个对象就会被销毁掉(操作的是同一个对象)

 copy产生一个新的对象是给新的对象引用计数+1(跟原来对象没有关系)->如果释放了原来的对象新的对象仍然存在

 

 autorelease:延迟释放等到需要释放的时候才会去释放也会引用计数-1常与自动释放池配合使用

 自动释放池:在自动释放池里面的对象只要使用了autorelease在出池的时候就会被统一释放掉

 自动释放池有两种写法:

1 @autoreleasepool {

 花括号内表示自动释放池内

 }出了花括号就表示出池(所有使用autorelease的对象全部被释放掉)

2 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

 只要在自动释放池对象 release之前都算池内 release之后

 [pool release];所有使用autorelease的对象全部被释放掉

 

 

 属性手动管理计数

 ARC:自动管理引用计数

ARC1、强壮的不会被释放调用<告诉系统这个属性是不能被释放掉的>

      2unsafe_unretained允许在特殊情况下被释放掉不安全的


          retain 给同一个对象保留引用计数                                            

          目的:为了保证一个对象不会被释放掉给这个对象引用计数+1

         如果一个对象被释放掉这个对象就是野指针为了防止使用野指针可以在这个对象释放之后同时给这个对象赋值为空(nil


      对象在自动释放池的生命周期:当对象在自动释放池被创建并使用autorelease对象会在自动释放池出池的时候,被自动释放池统一调用池内全部的autorelease释放全部对象

         可以使用在循环创建一些对象的时候不知道什么时候创建使用完毕可以选择使用自动释放池

 
0 0