自动释放池的原理及机制

一、自动释放池的原理及机制

一、O-C当中的内存释放,并不是像java/.net那样有一个自动的释放池,开发人员不用去关心有关内存释放的问题,O-C里面的自动释放池比c语言的手动内存管理要好一些,但是相对于java/.net来说又弱一些,所以说O-C当中的释放属于半自动的释放池。

二、什么是自动释放池

1、Autorelease pool

自动释放池(Autorelease pool)是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放

自动释放池本事销毁的时候,池子里面所有的对象都会做一次release操作

2、autorelease

任何OC对象只要调用autorelease方法,就会把该对象放到离自己最近的自动释放池中(栈顶的释放池)。

三、如何创建一个自动释放池

//ios5.0新方式

@autoreleasepool

{

}

//ios5.0之前的老方式

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

[pool release];

四、自动释放池如何释放对象内存

黄金法则:如果对一个对象使用了alloc,[mutable]copy,retain,那么必须使用相应的release或者autorelease.


当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

1.  ojc-c是通过一种"referring counting"(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,就会被系统销毁.

2. NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.

3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.

二、几种传值方式的区别

传值的方式有

1、正向传值 : A拥有B对象的指针 B对象申明一个公开的属性 在A中对B的属性进行传值 

特点:简单直观 易于掌握

缺点:不能进行反向传值

2、反向传值:需要用到代理的方法

A对象拥有B对象的指针 如果需要从B对象向A对象传值,这时就需要用到反向传值又称为回调  

方法:在B对象中写一个代理  再写一个传值的方法 id<protocol>delegate  (这个代理此时可以理解为A对象的一个实例对象)

【self.delegate  实现代理中的方法】运行到该方法时就会调用A中的方法 并将参数传递过去

 在A中 A遵守B的代理   B对象的一个实例对象 b.delegate = self 

- (void)(B中代理的方法){

在这里实现可以获得B中传过来的值并对其进行操作

}

优点:可以实现回调

缺点:实现起来比正向传值略显麻烦,在声明代理属性时不能使用strong修饰否则会造成强强引用,造成内存泄漏

3、block传值

block传值与反向传值有相似之处   

A对象拥有B对象的指针  

在B中声明@propoty  block (MyBlock) 

在B中声明一个关于MyBlock的方法 

实现MyBlock的方法 

A中创建一个B对象的实例对象 实现 关于MyBlock的方法  

优点:同样可以实现回调

缺点:block方法灵活多变 不利于实现  在block代码块中 self需要用weak修饰 

4、KVO观察者模式 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 5,758评论 8 119
  • 37.cocoa内存管理规则 1)当你使用new,alloc或copy方法创建一个对象时,该对象的保留计数器值为1...
    如风家的秘密阅读 887评论 0 4
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,202评论 30 471
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 1,522评论 1 3
  • 循环引用:http://ios.jobbole.com/82077/类别的作用功能:1.扩充现有类的功能2.对现有...
    得一切从简阅读 516评论 0 1