OC语言day06-02-2自动释放池注意事项

pragma mark 自动释放池注意事项

pragma mark 概念

/**
 自动释放池 是延迟释放对象
 */

pragma mark 代码

#import 
#pragma mark 类
#import "Person.h"
#pragma mark main函数
int main(int argc, const char * argv[])
{
    
    /*
    Person *p = [[Person alloc]init];
    @autoreleasepool {
        
        
        // 2. 在自动释放池中创建了对象,一定要调用autorelease,才会将对象放入自动释放池中
//        Person *p =[[Person alloc]init];
//        [p run];

        // 3. 只要在自动释放池中 调用 autorelease, 就会将对象放入自动释放池
        p = [p autorelease];
        [p run];

    }
    // 1.一定要在自动释放池中调用autorelease,才会将对象放入自动释放池中
//    Person *p = [[[Person alloc]init]autorelease];
     */
    
#warning 注意事项
    // 4. 一个程序中可以创建N个自动释放池,并且自动释放池还可以嵌套
    //  如果存在多个自动释放池的时候, 自动释放池是以"栈"的形势存储的 [此处的栈是一种数据结构,不是之前说的"栈、堆"是存储空间]
    // 栈的特点: 先进后出 (羽毛球桶就是栈 -- 先进后出)
    
    // 给一个对象发送一条 autorelease消息, 永远会将对象放到 栈顶的 自动释放池
    @autoreleasepool { // 创建第一个自动释放池
        @autoreleasepool { // 创建第二个自动释放池
            @autoreleasepool { // 创建第三个自动释放池
                Person *p = [[[Person alloc]init]autorelease];
                [p run];
            } // 第三个释放池销毁
            
            Person *p = [[[Person alloc]init]autorelease];
            [p run];
            
        } // 第二个释放池销毁
    } // 第一个释放池销毁
    
    return 0;
}
Person.h //人类
#import 

@interface Person : NSObject

- (void)run;
@end
Person.m
#import "Person.h"

@implementation Person

- (void)run
{
    NSLog(@"%s",__func__);
}

-(void)dealloc
{
    NSLog(@"%s",__func__);
    [super dealloc];
}
@end

你可能感兴趣的:(OC语言day06-02-2自动释放池注意事项)