zoukankan      html  css  js  c++  java
  • Autorelease自动释放池的使用

    Autorelease自动释放池的使用

    • 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain、release和autorelease.
    • MRC内存管理原则:谁申请,谁释放 遇到alloc/copy/retain 都需要添加release或autorelease
    • autorelease 只是一个标记,表明会延迟释放 当一个autorelease对象超出自己的作用域后,会被添加到离他最近的autorelease pool中,当pool开始倾倒的时候,会向池里面所有的对象发送一次release方法,释放pool中所有的对象。

    自动释放池autorelease pool的释放与消息循环有关

    • 模拟一个简单的消息循环
    void click(int type){
        printf("你执行的操作%d 
    ",type);
    }
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            while (YES) {
                printf("请输入要执行的操作,0结束:");
    
                int n;
                scanf("%d",&n); //接收用户的输入  等待  阻塞程序的运行
                if (n == 0) {
                    printf("程序结束
    ");
                    break;
                }else{
                    click(n);
                    continue;
                }
            }
        }
        return 0;
    }
    
    • 消息循环的执行过程

    应用程序开启->事件发生(例如点击)->转换成一个事件对象->开启autorelease pool->执行我们的处理代码,代码中生成的临时变量都可以放在pool中->pool销毁->下一次循环

    • 主线程的消息循环

    主线程内默认有一个开启的消息循环,在事件开启的时候创建自动释放池,在事件结束的时候倾倒释放池

    自动释放池的使用场景

    • 在循环中创建大量的临时变量
    • 在子线程中
    • 下面为循环中自动释放池使用 :
    for (int i = 0; i < largeNumber; ++i) {
    @autoreleasepool{
        NSString *str = @"Hello World";
        str = [str stringByAppendingFormat:@" - %d", i];
        str = [str uppercaseString];
        NSLog(@"%@", str);
    }
    }
    

    在循环中创建了大量的临时对象NSString,在方法没有走完的情况下,每次创建的对象是不会释放的,所以我们用自动释放池,在每次循环开始的时候把临时变量NSString放到池里,等每次循环结束的时候倾倒池子,从而每次释放释放NSString临时变量。

  • 相关阅读:
    docker安装
    win8换win7的操作方法
    java数组实现队列
    springMVC源码学习之获取参数名
    SpringMVC源码学习之request处理流程
    LeetCode 231. Power of Two
    LeetCode 202. Happy Number
    LeetCode 171. Excel Sheet Column Number
    Eclipse 保存代码时,不自动换行设置
    LeetCode 141. Linked List Cycle
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5701352.html
Copyright © 2011-2022 走看看