一、自动释放池的原理及机制
一、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观察者模式