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;
    }
    

      

  • 相关阅读:
    webpack debug
    linux下光标操作
    windows 下 基于express搭建 https协议的网站
    js里的null 与undefined
    scrollIntoView 前的元素滚动到浏览器窗口的可视区域内 不止垂直滚动,还有水平滚动
    js 四舍五入实现
    react 踩坑记
    String.slice
    sublime 常用插件
    springcloud 自己挖坑 @ConfigurationProperties不生效
  • 原文地址:https://www.cnblogs.com/hgj123/p/4108602.html
Copyright © 2011-2022 走看看