iphone开发--内存管理

         内存管理是iphone开发中很重要的一个环节,没有处理好会是系统出现很多问题,

很严重的一个就是直接导致程序闪退。因此,内存管理是很让新手头疼的,也是新手晋

级为菜鸟必走的一个环节。今天讨论的主题就是内存管理。

       内存管理包括:内存分配,对象使用,对象挂起,对象使用,内存释放。在使用之前

我们要为其分配空间,使用中保留其空间,使用完后要释放其空间。简单的分配和释放只

是内存管理的初级阶段。当我们引入对象所有权这一概念时,内存管理的难度就变大了。

对象所有权与接下来要解释的三个名词有关。

       首先,我们要解释三个名次:create,retain和copy。

       create和retain都会使对象的【object count】值加1,此时拥有对象所有权,因此使用

完后必须对其释放。copy不会是对象的【object count】值加1,此时没有拥有对象所有权,

使用完后不需对其释放。

在对象定义中需要注意的点(以NSMutbaleString和NSMutableArray为例):

NSMutableArray

initWithObject:       //对象的引用计数值不变

arrayWithObject:             //对象的引用计数值不变  

arrayWithObject:           //对象的引用计数值加1

addObject:                        //对象的引用计数值加1

arrayWithArray:      //对象的引用计数值加1,被参考的引用对象值也加1

initWithArray:             //对象的引用计数值加1

  initWihtArray: copyItem:     //对象的引用计数值从1开始


NSMutableString

initWithFormat:         //对象的引用计数值不变

initWithString: //对象的引用计数值不变

        然后开始说明,在对象使用中的内存管理。

        在容器中添加对象,将使对象的【object count】值加1,包括nsarray、nsdictionary。

引用的对象在使用完后需要释放,否则会导致内存泄漏。

在getter和setter方法中:

-(NSNumber *)count

{

    return _count;

}

-(void)setCount:(NSNumber *)newCount

{

    [newCount retain];

    [_count release];.//在OC中,对象为没有初始化也可以执行这一步操作

    _count = newCount;

}

-(void)reset

{

    NSNumber *zero = [[NSNumber alloc] initWithInteger:0];

    [self setCount:zero];

    [zero release];

}

-(void)reset

{

      NSNumber *zero = [NSNumber initWithInteger:0];

      [self setCount:zero];

}


在类变量初始函数和析构函数(dealloc)中,不需要对类变量执行初始化操作。

-init

{

    self = [super init];

    if(self)

    {

    _count = [[NSNumber alloc] initWithInteger:0];

    }

     return self;

}

-initWithCount:(NSNumber *)startingCount

{

self = [super init];

    if(self)

    {

        _count = [startingCount copy];

    }

    return self;

}

使用中的对象可能面临着被释放的危险,包括如下两种情况

 1> heisenObject将被释放:

        heisenObject = [array objectAtIndex:n];

        [array removeObjectAtIndex:n];


2>

id parent = <#create a parent object#>;

heisenObject = [parent child];

[parent release];

因此防止如上情况的出现,我们可以采取如下的对策:

heisenObject  = [[array objectAtIndex:n] retain];

[array removeObjectAtIndex:n];

//user heisenObject...

[heisenObject  release];

最后,附上官网上关于内存管理的解说图对此次内存管理解说做个总结。希望对大家掌握内存管理有所帮助!


     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值