zoukankan      html  css  js  c++  java
  • OC 内存管理-02 autorelease 概念 以及用法

    (1)	@autoreleasepool { }//自动释放池代表,池子将要被销毁,对池子中所有的对象进行一次release操作
    (2)	不管你这个对象时在@autoreleasepool 之内创建的还是在之外创建的,只要你在池子中调用了autorelease那么这个对象就会被放入到池子中
    (3)	只有在自动释放池的作用域中调用对象的autorelease方法才能够正确的讲对象放入到池子中 
    (4)	如果在自动释放池中一个对象被多次释放[autorelease],那么会报野指针错误
    
    
    
    ----------------------------验证代码---------------------
    
    //
    //  main.m
    //
    
    //内存管理原则(配对原则):只要出现了new,alloc,retain方法,就要配对出现release,autorelease
    //对象存入到自动释放池中,当这个池子被销毁的时候他会对池子中所有的对象进行一次release操作
    //怎么把对象存到池子中
    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    int main(int argc, const char * argv[])
    {
        /* 示例1
        //自动释放池
        //大括号代表池子的作用域
        @autoreleasepool
        {
            
         //release 功能 retaincount - 1
         //autorelease 好像功能也是 retaincount - 1 ?
            //1
            Person * p = [[Person alloc] init];
    //        [p release];//retainCount立即 -1
            [p autorelease]; //autorelease方法的作用只是将对象放入到池子中,然后返回一个self
            
            NSLog(@"asdfasdf");
            
         }//代表,池子将要被销毁,对池子中所有的对象进行一次release操作,[p release] 0
         */
        
        /*
        //autoreleasepool我么可以自己随意的创建
        
        // 示例2
        //1//不管你这个对象时在@autoreleasepool 之内创建的还是在之外创建的,只要你在池子中调用了autorelease那么这个对象就会被放入到池子中
        Person * p = [[Person alloc ] init];
        
        @autoreleasepool {
            
            [p autorelease];
            
        }//p 0
        */
        // 示例3
        /*
        //1 只有在自动释放池的作用域中调用对象的autorelease方法才能够正确的讲对象放入到池子中
        Person * p = [[Person alloc] init];
        [p autorelease];
        
        NSLog(@"aaaa");
        @autoreleasepool {
            
        }
        NSLog(@"bbb");
         */
        //示例4
        /*
        // 1
        Person *  p = [[Person alloc] init];
        
        @autoreleasepool {
            
            [p autorelease];//加入第一次
            
            [p autorelease];//加入第二次
            
            NSLog(@"abc");
        }//[p release]0 [p release]
        
         NSLog(@"cbd");
        */
        
        //示例5
        /*
        //1
        Person * p = [[Person alloc] init];
        
        @autoreleasepool {
            
            @autoreleasepool {
                
                [p autorelease];
            }//?[p release] 0
            
        }
        */
        
        
        Person * p = [[Person alloc] init];
        
        @autoreleasepool {
            
            [p autorelease];
            
            @autoreleasepool {
                
             
                [p autorelease];
            }//[p release] 0
            
            
        }//[p release];
        
        
        return 0;
    }
    

      

  • 相关阅读:
    【大白话系列】MySQL 学习总结 之 Java系统如何和 MySQL 打交道?
    【Spring Boot 源码解读】之 【为何引入了 Jedis 依赖最后用的还是 Lettuce 客户端?】
    [Python自学] PyQT5-QPushButton、QRadioButton、QCheckBox、QComboBox控件
    [Python自学] PyQT5-QLabel、QLineEdit、QTextEdit控件
    [Python自学] PyQT5-QTDesigner窗口及组成
    [Python自学] PyQT5-QTDesigner中关联信号和槽
    [Python自学] PyQT5-QTDesigner控件相关
    [Python自学] PyQT5-QTDesigner布局相关
    [Python自学] PyQT5-pycharm中配置QTDesigner扩展工具
    [音视频] 音视频基础知识
  • 原文地址:https://www.cnblogs.com/hgj123/p/4108602.html
Copyright © 2011-2022 走看看