自动释放池
是什么?
对象,结构
面试题1
- 临时变量什么时候释放
- 自动释放池 原理?
- 自动释放池 能否嵌套使用
GC garbishi
所有对象都加到自动释放池管理?
1. Clang :cpp源码·__AtAutoReleasePool __autoreleasepool
__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 源码分析
4.1. 创建一个page
-
page初始化
begin()]this, sizeof(this) 对象地址, + 56 复制代码
magic_t 结构体
unit32 4字节
MRC下
NSObject *obj = [【NSObject alloc】 autorelease];
_objc_autoreleasePoolPrint();
-
设置当前page为hotpage
-
设置当前哨兵对象
-
add – page 内存的ping平移
(504(NSObjec对象) + 1(哨兵对象))* 8 + 56字节(1个page)= 4096
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END