//
//  main.m
/*
 autorelease也是用于内存管理的,给对象发送autorelease消息就会把对象放入autoreleasepool这个池子中,当池子销毁的时候会对池子里面的所有对象发送一条release消息,只是计数器减一,不一定会销毁。
 1.autorelease方法会返回对象本身,好比init方法,
    Person *p = [Person new];
    p = [p autorelease];
 2.调用autorelease方法不会对对象的引用计数器加1。
 3.不需要写release方法。
 */


#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    
     //需要把项目了 变成手动内存管理MRC
    @autoreleasepool {
         Person *p3  =[[Person alloc] init];
         [p3 run];
         
         // 时时刻刻都关注对象什么时候被释放
         [p3 release];
         p3 = nil;
         
         // 给野指针发送消息
         [p3 run];
    }
    
    
    
    Person *p4 = nil;
    @autoreleasepool { // 创建一个自动释放池
        p4 = [[Person alloc] init]; // 1
        // 不用关心对象什么时候释放, 只要能够访问p的地方都可以使用p
        p4 = [p4 autorelease]; // 只要调用了autorelease,将对象p放入自动释放池中,当自动释放池释放的时候,会池里面的所有对象发送一条release消息。
        NSLog(@"%lu",[p4 retainCount]);  //1
        
        p4 = [p4 autorelease];
        p4 = [p4 autorelease];
        p4 = [p4 autorelease];
        p4 = [p4 autorelease];
        p4 = [p4 autorelease];
        NSLog(@"%lu",[p4 retainCount]);  //1
        [p4 retain]; // 2
        
        [p4 run];
    } // 自动释放池销毁了, 给自动释放池中所有的对象发送一条release消息
    NSLog(@"%lu",[p4 retainCount]);
    [p4 retain];
    NSLog(@"%lu",[p4 retainCount]);
    [p4 run];
    
    
    

    // autorelease其它写法
    @autoreleasepool {
//        Person *p = [[Person alloc] init];
//        p = [p autorelease];
        Person *p  = [[[Person alloc] init] autorelease];
        [p run];
    }
    
    
    
    
    // ios5以前的写法:创建一个自动释放池
    // 自动释放池只是将release延迟了而已
    
    NSAutoreleasePool *pool5 = [[NSAutoreleasePool alloc] init];
    
    Person *p5 = [[[Person alloc] init] autorelease];
    [p5 run];
    
    // 销毁一个自动释放池
    [pool5 release];
    
    return 0;
}
//  Person.h

#import <Foundation/Foundation.h>

@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