iOS日记5-autoreleasepool和autorelea

2017-02-09  本文已影响0人  Mcyboy007

1.autoreleasePool的具体使用

MRC:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id obj = [[NSObject alloc] init];
[obj autorelease];
[pool drain];  //调用[obj release] 
ARC和MRC:
@autoreleasepool {
  id obj = [[NSObject alloc] init];
}

2.autoreleasepool原理

1)与NSRunLoop的关系

每一个线程(包括主线程)都有一个NSAutoreleasePool栈. 当一个新的池子被创建的时候, push进栈. 当池子被释放内存时, pop出栈. 对象调用autorelease方法进入栈顶的池子中. 当线程结束的时候, 它会自动地销毁掉所有跟它有关联的池子.
在当前的runloop迭代中,系统会加入autoreleasepool的push和pop操作,用于管理对象。

2)内部实现

这里涉及到了一个AutoreleasePoolPage类。

//非完整实现
struct AutoreleasePoolPage {
  magic_t const magic;
  id *next;
  pthread_ const thread;
  AutoreleasePoolPage *const parent;
  AutoreleasePoolPage *child;
  uint32_t const depth;
  uint32_t hiwat;
}

使用@autoreleasepool{ }时,编译器将其改写为:

void *context = objc_autoreleasePoolPush();  //作为一个记录点,每一次的释放会将2个记录点内的对象都释放,直到完全释放
//some codes
objc_autoreleasePoolPop(context);

3.需要手动创建autoreleasepool的时候

4.参考资料

http://blog.sunnyxx.com/2014/10/15/behind-autorelease/
http://www.jianshu.com/p/5559bc15490d
《Objective-C高级编程:ios与OS X多线程和内存管理》

上一篇下一篇

猜你喜欢

热点阅读