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