关于内存管理

2016-11-29  本文已影响0人  FongG

首先明确一点什么是自动引用计数

自动引用计数器是在ios5以后增加的一项内存管理机制,是指内存管理中对引用采取自动计数的一项技术,让编译器来进行内存管理。

在LLVM编译器中设置ARC为有效状态,就无须再次键入retain、release


</br>

内存管理的是思考方式

  1. 自己创建的对象,默认自己持有
  2. 非自己创建的对象,retain后也能够持有
  3. 自己持有的对象,在不需要的时候需要释放
  4. 不是自己持有的对象,不能释放


</br>

那么什么才叫做是“自己创建”的类呢?

使用以下名称开头的方法意味着是自己创建的对象并持有的对象:

1. alloc
2. new
3. copy
4. mutableCopy

另外根据类似“使用以下名称开头的方法名”(实现方法中是以上述方法重写),下列名称也意味着自己创建自己持有。

1. allocMyObject
2. newTheClass
3. copyThis
4. mutableCopyThat

自己创建的对象,自己持有,自己释放

/*
 * 创建时
 */

//自己生成对象并持有对象
id obj = [[NSObject alloc] init];


/*
 * 持有对象
 */

// 自己创建不需要retain就已经持有


/*
 * 释放时
 */

//自己创建的对象,需要自己去释放
[obj release];

// 释放后的 指向对象的指针依然保存在对象obj中,但一旦释放绝对不能再访问

非自己创建对象,在持有后,可以释放

/*
 * 创建时
 */

//取得非自己生产的对象,但暂时并不持有
id obj = [ NSArry arry ];


/*
 * 持有对象
 */

[obj retain];

/*
 * 释放对象
 */

//对自己持有的对象,如果不需要再使用,持有者需要去释放
[obj release];

非自己持有的对象,不能去释放


- (id)object{

   /*
    * 自己持有对象
    */
   id obj = [[NSObject alloc] init ];


    /*
     * 取得的对象存在, 但自己不持有对象
     */

//需要使用到autoRelease是因为obj需要在没有持有的状态下被释放,而现在我们设计object方法所创建的对象是不持有的,这样就说明最后retain的对象是无法主动release obj。所以需要借助autoRelease来释放obj,这样既延长了obj的生命周期,又保证在不需要的时候释放obj
    [obj autoRelease];


    return obj;
}

   NSMutableString *mStr = [NSMutableStringstringWithFormat:@"abc"];
   
   NSLog(@"mStr:%p,%p",  mStr,&mStr);

//mstr 打印%p输出的是 mstr指向的是@“abc”的首地址
//&mStr 输出的是mstr自己保存在内存中的地址
上一篇下一篇

猜你喜欢

热点阅读