美文网首页八天学会OC
第06天OC语言(01):autorelease基本概念

第06天OC语言(01):autorelease基本概念

作者: liyuhong | 来源:发表于2017-07-22 08:57 被阅读20次
    • 不要等到明天,明天太遥远,今天就行动。
    须读:看完该文章你能做什么?

    1.能知道什么是autoreleasepool。

    学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)

    什么是release/retain,什么是野指针


    一、本章笔记
     一、为什么要什么到自动释放池
        比如写release的时候 ,我们在release下面调用了对象方法 可能会出现野指针访问
        这样的情况下,我们需要时时刻刻关注对象 什么时候释放 
        这时候 就出现了自动释放池
     二、创建自动释放池的两种方式 
        iOS5.0之后(推荐)
        @autoreleasepool {
            // 在这里面使用的对象 都会加到自动释放池里面,当过了自动释放池代码块之后
            都会对里面的对象 进行一次release消息 (不是销毁对象,而是release消息)
        }
        iOS5.0之前
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
        // ... 中间就是将所有的对象加入到自动释放池
        // 销毁一个自动释放池
        [pool release];
     三、对象加入自动释放池的两种写法(调用autorelease方法的时候 ,会返回本身)
        写法1
        Person *p = [[[Person alloc]init] autorelease]; // 推荐使用
        写法2
        Person *p = [[Person alloc]init];
        p = [p autorelease];
    
    
    二、code
    main.m
    #pragma mark 01-autorelease基本概念
    #pragma mark - 代码
    #import <Foundation/Foundation.h>
    #pragma mark 类
    #import "Person.h"
    #pragma mark - main函数
    int main(int argc, const char * argv[])
    {
        
        // iOS5.0之后写法
        /*
        @autoreleasepool {
    //         Person *p  = [[Person alloc]init];
    //         [p run];
    //         // 时时刻刻都要关注对象 什么时候 释放
    //         [p release];
    //         [p run]; // 给野指针发消息 会报错
            
            Person *p = [[Person alloc]init];
            // 不用关心对象 什么时候 释放, 只要能够访问p的地方 都可以使用p
            p = [p autorelease]; // 只要调用了autorelease,那么就不用调用release了
    //        [p retain];
            [p run];
            [p run];
            [p run];
        }
         */
    #pragma autorelease其他写法1
        @autoreleasepool {
    //        Person *p = [[Person alloc]init];
    //        p = [p autorelease];
            Person *p = [[[Person alloc]init] autorelease];
    
            [p run];
        }
        
    #pragma autorelease其他写法2
        // 创建一个自动释放池
        // 自动释放池 只是 将release延迟了而已
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
        Person *p = [[[Person alloc]init] autorelease];
        [p run];
        // 销毁一个自动释放池
        [pool release];
        return 0;
    }
    
    
    Person
    >>>.h
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    - (void)run;
    
    @end
    
    >>>.m
    #import "Person.h"
    
    @implementation Person
    
    - (void)run
    {
        NSLog(@"%s",__func__);
    }
    - (void)dealloc
    {
        NSLog(@"%s",__func__);
        [super dealloc];
    }
    
    @end
    
    

    相关文章

      网友评论

        本文标题:第06天OC语言(01):autorelease基本概念

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