自动释放池内存管理是软件代码中的重中之重,内存管理的好坏,直接影响着软件的稳定性。在Cocoa中,有自动释放池,这类似于C++中的智能指针。
NSObject有一个方法是autorelease,当一个对象调用这个方法时,就会将这个对象放入到自动释放池中。
drain,该方法是清空自动释放池,不是销毁它。drain方法只适用于Mac OS X 10.4以上的版本,在我们写的代码中要使用release,release适用于所有版本。
自动释放池是以栈的方式实现,当创建一个自动释放池A时,A被压入栈顶,这时将接入autorelease消息的对象放入A自动释放池,这时创建一个新的B自动释放池,B被压入栈顶,创建完成后删除B,这个接收autorelease消息的对象依然存在,因为A自动释放池依然存在。
引用计数每个对象都有一个与之相应的整数,称它为引用计数,当该 引用计数为0时,Objective-C自动向该对象发送dealloc,以销毁该对向,与该引用计数相关的方法(消息)有下面几个
1 增加引用计数:通过alloc,new,copy创建一个对象时,该对象的引用计数加1(其实就是1,因为之前为0)
2 增加引用计数: retain
3 减少引用计数: release
局部分配内存(临时对象):
1 如果使用alloc,new,copy创建对象,则需要主动调用对象的release方法
2 如果使用非alloc,new,copy创建对象,我们认为该 对象引用计数为1,并已经加入了自动释放池,我们不需要主动的调用对象的release方法。
拥有对象(在类中以成员的方法存在):
1 如果使用alloc,new,copy创建对象,则需要在dealloc方法中,释放该对象
2 如果使用非alloc,new,copy创建对象,则在拥有该对象时,保留该对象(执行retain方法),在dealloc方法中,释放该对象。
dealloc当对象的引用计数为0时,Objective-C会自动发送对象的dealloc消息(自动调用对象的dealloc方法,类似于C++的析构函数),所以我们可以自己重写dealloc方法,来实现类里的对其它使用资源的释放工作。
注意:不要直接在代码中显示调用dealloc方法。
垃圾回收在Objective-C 2.0中引入了垃圾回收机制(自动管理内存),在工程设置里设置Objective-C Garbage Collection为Required[-fobjc-gc-only]就可以使用垃圾回收机制。
启用垃圾回收机制后,通常的内存管理命令都变成了空操作指令,不执行任何操作。
Objective-C的垃圾回收机制是一种继承性的垃圾回收器,垃圾回收器定期检查变量和对象以及他们之间的指针,当发现没有任何变量指向对象时,就将该对象视为被丢弃的垃圾。所以在不在使用一个对象时,将指针他的指针设置为nil,这时垃圾回收器就会清理该对象。
注意:如果开发iPhone软件,则不能使用垃圾回收。在编写iPhone软件时,Apple公司建议不要在自己的代码中使用autorelease方法,并且不要使用创建自动释放对象的函数。
类别什么是类别?类别是一种为现有类添加新方法的方式。
为什么使用类别或者说使用类别的目的是什么?有以下三点:
第一,可以将类的实现分散到多个不同的文件或多个不同的框架中。
如果一个类需要实现很多个方法,我们可以将方法分类,把分好的类形成类别,可以有效的管理和驾驭代码。
第二,创建对私有方法的前向引用。
第三,向对象添加非正式协议。
委托委托的意思就是你自己想做某事,你自己不做,你委托给别人做。
在Ojbective-C中,实现委托是通过类别(或非正式协议)或者协议来实现。
举个例子:Apple要生产iPhone,Apple自己不生产(种种原因,其中之一就是在中国生产成本低,他们赚的银子多),Apple委托富士康来生产,本来富士康原来不生产iPhone,现在要生产了,所以他得自己加一个生产iPhone的生产线(类别,增加生产iPhone方法),这就是通过类别来实现委托。下面用代码来说明这个例子。
.....
Apple *apple = [[Apple alloc ] init];
Foxconn *fox = [[Foxconn alloc] init];
[apple setDelegate:fox];
[apple produceIPhone];
........
@implementation Apple
-(...) setDelegate:(id) x{
delegate = x; //! 将委托的生产对象指定为x
}
-(...) produceIPhone{
[delegate produceIPhone]; //! 委托对象生产iPhone
}
@interface Foxconn : NSObject
...
@end
@interface NSObject(ProduceIPhone) //! Foxconn之前就可以生产其它产品,有过声明和定义
-(...) produceIPhone //! 增加生产iPhone能力
@end
@implementation NSObject(ProduceIPhone)
//! 生产iPhone
-(...) produceIPhone{
......
}
@end
|
|