iOS开发--漫谈内存管理(一)

时间:2023-03-09 00:54:55
iOS开发--漫谈内存管理(一)

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高级编程》一书,权当个人读书总结吧。