美文网首页
关于内存管理

关于内存管理

作者: FongG | 来源:发表于2016-11-29 23:05 被阅读0次

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

    自动引用计数器是在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自己保存在内存中的地址
    

    相关文章

      网友评论

          本文标题:关于内存管理

          本文链接:https://www.haomeiwen.com/subject/xnezpttx.html