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








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值