美文网首页
第五章、内存管理相关

第五章、内存管理相关

作者: Evans_Xiao | 来源:发表于2019-08-09 21:31 被阅读0次

一、什么时候是用@autoreleasepool

1、写基于命令行的的程序时,就是没有UI框架,如AppKit、Cocoa框架时。
2、当我们的应用有需要创建大量的临时变量的时候,可以是用@autoreleasepool来减少内存峰值。
3、for循环大量的图片数据等内存消耗大的场景。

二、AutoreleasePool的实现原理

在编译时@autoreleasepool{}被转换为一个__AtAutoreleasePool,通常这个结构体会在初始化时调用objc_autoreleasePoolPush()方法,在析构时调用objc_autoreleasePoolPop()方法。而这些方法都是对AutoreleasePoolPage的简单封装。AutoreleasePool并没有单独的结构,而是由若干个AutoreleasePoolPage以双向链表的形式组合而成(分别对应结构中的parent指针和child指针)。所以想深入理解AutoreleasePool必须首先了解AutoreleasePoolPage

可以使用clang -rewrite-objc命令将Objective-C代码重写成C++代码。

clang -rewrite-objc main.m

extern "C" __declspec(dllimport) void * objc_autoreleasePoolPush(void);
extern "C" __declspec(dllimport) void objc_autoreleasePoolPop(void *);
struct __AtAutoreleasePool {
  __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();}
  ~__AtAutoreleasePool() {objc_autoreleasePoolPop(atautoreleasepoolobj);}
  void * atautoreleasepoolobj;
};
#define __OFFSETOFIVAR__(TYPE, MEMBER) ((long long) &((TYPE *)0)->MEMBER)
int main(int argc, char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;
    }
}

从上述重写代码表现可以看出,单个autoreleasepool的运行过程可以简单地理解为objc_autoreleasePoolPush()[obj release]objc_autoreleasePoolPop(void *)三个过程。

相关文章

  • 内存管理相关

    引文: 多线程相关 OC 语言相关 内存管理相关 UI视图相关 RunLoop相关 内存布局 内存管理方案 数据结...

  • 《Effective Objective-C 2.0》读书笔记(

    第五章 内存管理 第29条:理解引用计数 OC 中有手动内存管理(MRC) 自动内存管理(ARC)手动内存管理需要...

  • 第五章、内存管理相关

    一、什么时候是用@autoreleasepool 1、写基于命令行的的程序时,就是没有UI框架,如AppKit、C...

  • 内存管理相关

    1.内存布局 stack: 方法调用 heap: 通过alloc等分配的对象 bss: 未初始化的全局变量 dat...

  • 内存管理相关

    一.内存 1•移动设备的内存极其有限,每个app所能占用的内存是有限制的 •下列行为都会增加一个app的内存占用Ø...

  • 内存管理相关

    一· 使用CADisplayLink,NSTimer有什么注意点? 其中创建定时器的方式有:NSTimer,CAD...

  • 内存管理相关

    1.堆和栈 堆:存放OC对象,先进先出。(吃了拉) 栈:存放非OC对象,先进后出。(吃了吐) 2.@propert...

  • 内存管理相关

    1. 内存布局 stack:栈区,方法调用 heap:堆区,通过alloc等分配的对象 bss:未初始化的全局变量...

  • 内存管理相关

    一、ARC管理内存是使用assign还是weak? assign: 可以修饰基本数据类型,也可以修饰对象。修饰代理...

  • ② 内存管理相关

    一、 在 Obj-C 中,如何检测内存泄漏?你知道哪些方式? 目前我知道的方式有以下几种 Memory Leaks...

网友评论

      本文标题:第五章、内存管理相关

      本文链接:https://www.haomeiwen.com/subject/lkpkjctx.html