//
// 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