object-c学习笔记:内存管理
2011-01-16 12:53
323 查看
粗略的记录下object-c的内存管理机制,有迷糊的地方也mark下,希望之后的学习能解决把。
手动释放和引用计数:
熟悉windows开发的童鞋,对于引用计数应该是不会陌生的。任何“对象”(可以是类的实例,也可以是个资源)在内部会维护一个变量,称为计数器,对象初期化时,计数器初期化为1,任何对该对象的引用会使得计数器加一,同样的解引用会使得计数器减一,当计数器的值为0时,该对象销毁。引用计数使得一个资源(对象)可以在多处被使用,使用的场景类只需要关心自己什么时候需要该资源,什么时候不需要。
在object-c中使用管理对象的生存期,可以使用下面的这些函数:
retain -> 计数器加一
realse -> 计数器减一
注意的是当计数器=0,会自动调用对象的dealloc,就是析构函数了。
代码
对象的所有权
因为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基础编程里作者喊的,别来找我。。。
手动释放和引用计数:
熟悉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基础编程里作者喊的,别来找我。。。
相关文章推荐
- Object-c基础编程学习笔记-内存管理
- Object-C 学习笔记(十)---内存管理MRC
- Object-C学习笔记十-----内存管理
- object-c 内存管理学习笔记
- C++动态内存创建与内存管理学习笔记
- Object-C 开发学习笔记三:NSArray,NSdictionary,NSSet
- Object-C 学习笔记(十四)---Foundation之NSMutableString
- Object C NSArray (学习笔记三)
- s3c2440 内存管理单元MMU学习笔记
- flex Shared Object 学习笔记
- Inside the C++ Object Model学习笔记[Chap4.0-4.2]
- 黑马程序员--IOS_学习笔记_内存管理
- 转: C++动态内存创建与内存管理学习笔记[3]
- 黑马视频学习笔记-内存管理-循环引用
- Java学习笔记--HashMap中使用object做key的问题【转】
- Client Object Model学习笔记
- Object-C 学习笔记(十九)---#include 、#import 、@class
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第十二课:Cocos2D-X内存管理1-3
- Object-C学习笔记四-----组合
- Object-C学习笔记八-----Foundation Kit快速教程NSArray NSEnumerator NSDictioary NSNumber NSValue NSNull