NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// code
[pool drain];
@autoreleasepool {
// code
}
- (void)dealloc {
NSLog(@"HXPerson dealloc");
[super dealloc];
}
int main(int argc, const charchar * argv[]) {
HXPerson *person = [[HXPerson alloc] init];
[person release];
return 0;
}
int main(int argc, const charchar * argv[]) {
@autoreleasepool {
// 根据上面介绍的,我们要在初始化的时候,调用autorelease方法
HXPerson *person = [[[HXPerson alloc] init] autorelease];
}
return 0;
}
1.对象执行autorelease方法时会将对象添加到自动释放池中 2.当自动释放池销毁时自动释放池中所有对象作release操作 3.对象执行autorelease方法后自身引用计数器不会改变,而且会返回对象本身 4.autorelease实际上只是把对象release的调用延迟了,对于对象的autorelease系统只是把当前对象放入了当前对应的autorelease pool中,当该pool被释放时([pool drain]),该pool中的所有对象会被调用Release,从而释放使用的内存。这个可以说是autorelease的优点,因为无需我们再关注他的引用计数,直接交给系统来做! 5.对于操作占用内存比较大的对象的时候不要随便使用,担心对象释放的时间太迟,造成内存高峰, 但是操作占用内存比较小的对象可以使用
__weak id reference = nil;
- (void)viewDidLoad {
[super viewDidLoad];
@autoreleasepool {
NSString *str = [NSString stringWithFormat:@"autoreleasePool"];
}
NSLog(@"%@", str); // Console: (null)
}
int main(int argc, charchar * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
int main(int argc, const charchar * argv[]) {
/* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;
}
return 0;
}
voidvoid *objc_autoreleasePoolPush(void) {
return AutoreleasePoolPage::push();
}
void objc_autoreleasePoolPop(voidvoid *ctxt) {
AutoreleasePoolPage::pop(ctxt);
}
class AutoreleasePoolPage {
magic_t const magic;
idid *next;
pthread_t const thread;
AutoreleasePoolPage * const parent;
AutoreleasePoolPage *child;
uint32_t const depth;
uint32_t hiwat;
};
#define I386_PGBYTES 4096
#define PAGE_SIZE I386_PGBYTES