1、MRC与ARC
苹果提供两种内存管理机制:一种是MRC(manual reference count),即手动引用计算;另一种是ARC(auto reference count),即自动引用计数。手动引用计,顾名思义,需要程序员主动调用retain、release等方法来管理内存,而自动引用计数方式,则是编译器在编译阶段把内存管理代码自动插入在需要手动调用的地方。这样就把程序员从复杂的管理内存的工作中解放出来,将更多精力放在实现具体的业务逻辑上。需要注意的是,ARC要在xcode4.2或者以上版本、LLVM编译器3.0版本下才能使用。
2、引用计算的实现方式
一种是GNUStep的实现方式:对象生成的时候,在对象的头部添加retained属性,表示该对象的引用计数,retain方法调用时retained加1,release方法被调用时,retained减1,当retained计数为0时,释放该对象。
一种是苹果的实现方式:引用计数表,表的大概形式{对象A的引用计数:对象A的内存地址,对象B的引用计数:对象B的内存地址,..... ,对象N的引用计数:对象N的内存地址}。
3、内存管理的思考方式
a、自己生成的对象,自己持有
id obj = [[NSObject alloc] init]; //此时,对象被生成,并且obj持有该对象。该系列方法包括:alloc、new、copy和mutableCopy
b、非自己生成的对象,自己也能持有
id obj = [NSMutableArrray array];//对象被生成,且obj指向该对象,但是obj并不持有该对象,需要调用[obj retain]才能真正持有
c、不再需要自己持有的对象时释放
d、非自己持有的对象无法释放
新手可能很难注意并理解第二条规则,它是如何做到的呢,实现方式大概如下:
- (id) object { //对象生成,并且obj持有该对象 id obj = [[NSObject alloc] init]; //取得对象存在,但自己不持有该对象 [obj autorelease]; return obj; }
4、关于autorelease
autorelease使用对象在超出制定的生存范围时能够自动并正确释放,类似于c语言中的自动变量。autorelease的典型用法如下:
NSAutoReleasePool *pool = [[NSAutoReleasePool] alloc init]; id obj = [[NSObject alloc] init]; [obj autorelease]; [pool drain]; //pool对象废弃时,[obj release]方法自动被调用
PS:文章大部分思想摘自《Objective-C高级编程》一书,权当个人读书总结吧。
时间: 2024-10-18 08:00:32