object-c学习笔记:内存管理

粗略的记录下object-c的内存管理机制,有迷糊的地方也mark下,希望之后的学习能解决把。

手动释放和引用计数:
    熟悉windows开发的童鞋,对于引用计数应该是不会陌生的。任何“对象”(可以是类的实例,也可以是个资源)在内部会维护一个变量,称为计数器,对象初期化时,计数器初期化为1,任何对该对象的引用会使得计数器加一,同样的解引用会使得计数器减一,当计数器的值为0时,该对象销毁。引用计数使得一个资源(对象)可以在多处被使用,使用的场景类只需要关心自己什么时候需要该资源,什么时候不需要。
    在object-c中使用管理对象的生存期,可以使用下面的这些函数:
    retain -> 计数器加一
    realse -> 计数器减一
    注意的是当计数器=0,会自动调用对象的dealloc,就是析构函数了。

代码
@interface Engine : NSObject
@end

@implementation Engine
@end

@interface Car : NSObject
{
Engine
* engine;
}
@end

@implementation Car
- (void) setterEngine: (Engine*) newEngine
{
[newEngine retain];
[engine release];
engine
= newEngine;
}

- (void) dealloc
{
NSLog(
@"car is dealloced");
[super dealloc];
}
@end

int main(char argc, char* argv[]) {

Car
* aCar = [[Car alloc] init];
Engine
* engine = [Engine new];
[aCar setterEngine: engine];
[engine release];

[aCar release];

return 0;
}

 


对象的所有权
    因为object-c中的对象都是new出来的,没有像c++中的那种堆栈上的对象(不知道是不是这样,存疑。。),如果不使用autorelease或是GC的话,所有对象的生存期管理都必须由程序员自己来完成。这里记录下object-c基础编程里提到的编程惯用法, main(场景)中engine赋值给car之后,自己就没用了,立即release掉,注意的是setter函数的使用,要先retain newEngine,然后release掉旧的Engine,顺序不能错,如果反过来,当newEngine = oldEngine时,会导致engine先被解构掉。


自动释放autorelease
    这样老是要手动管理引用计数确实是挺累的,object-c中提供了另外一个方法,就是autorelease。使用是挺简单的,生成一个自动释放池,把你不想手动管理的对象一概扔进去,释放池析构或是调用drain,所用放在里面的对象一起受到一个release,done。。。
    具体不写了,写几个注意点:
    一:new alloc copy产生的对象,默认不使用autorelease,其他的函数,比如initWithString之类的则默认使用autorelease。
    二:据说(书上说)App kit是会默认生成AutoreleasePool的,不需要自己生成,到时候还要看看代码。
    三:同样据说在App kit的消息循环中,每个消息处理前生成一个AutoreleasePool,消息处理完了Pool就消灭掉了。
    四:IPhone上不要使用Autorelease。。。这个我就迷糊了,难道是性能的影响。。。

GC的使用
    好吧,我得承认,GC神马的从来就没好好研究过,object-c的GC机制啥的也不大清楚,反正用法是一样的,对象只管new出来,你只管管理指针,不用的地方=nil就行了,注意点写下:
    一:这是object-c2.0才有的,不是啥版本都能用的。
    二:要使用GC,在xcode中需要设置下,完了所有内存管理函数就失效了,大概总是预编译那种玩意把。
    三:IPhone里面不要用GC,这是object-c基础编程里作者喊的,别来找我。。。

 

posted @ 2011-01-16 12:53  hjtc  Views(1821)  Comments(0Edit  收藏  举报