iphone开发--内存管理

来源:互联网 发布:身份证模拟软件 编辑:程序博客网 时间:2024/05/03 13:27

         内存管理是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];

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


     

原创粉丝点击