(001)自动释放池AutoReleasePool

自动释放池

是什么?
对象,结构

面试题1

  1. 临时变量什么时候释放
  2. 自动释放池 原理?
  3. 自动释放池 能否嵌套使用
GC garbishi

所有对象都加到自动释放池管理?

1. Clang :cpp源码·__AtAutoReleasePool __autoreleasepool

image.png

__objc_autoReleasePoolPush

__objc_autoReleasePoolPop

struct __AtAutoreleasePool {
    //构造
  __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();}
     //析构
  ~__AtAutoreleasePool() {objc_autoreleasePoolPop(atautoreleasepoolobj);}
  void * atautoreleasepoolobj;
};
复制代码

2. 从汇编callq,也可以看到 push pop的调用

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
复制代码

3. runloop 与 autoreleasepool 的关系

4. autoreleasepoolPage 源码分析

image.png

4.1. 创建一个page

image.png

  1. page初始化
    begin()]

     this, sizeof(this)
     对象地址, + 56
     
    复制代码

image.png

magic_t 结构体
unit32 4字节

MRC下
NSObject *obj = [【NSObject alloc】 autorelease];
_objc_autoreleasePoolPrint();

  1. 设置当前page为hotpage

  2. 设置当前哨兵对象

  3. add – page 内存的ping平移

image.png

(504(NSObjec对象) + 1(哨兵对象))* 8 + 56字节(1个page)= 4096

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享