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

  

原文地址:https://www.cnblogs.com/hgj123/p/4108602.html