12、内存管理

96 阅读1分钟

iOS中可能会出现的内存问题:

CADisplayLink、NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用

解决方案:

通过使用代理可以让proxy弱引用持有控制器,从而更好避免出现循环引用的问题

GCD定时器封装:

nNSTimer依赖于RunLoop,如果RunLoop的任务过于繁重,可能会导致NSTimer产生延迟

可以使用GCD的定时器,避免偏差,以下是GCD定时器的简单封装

iOS程序中的内存布局:

代码段:编译之后的代码

数据段包括:

字符串常量:如NSString *str = @"xxx"

已初始化数据:已初始化的全局变量、静态变量等

未初始化数据:未初始化的全局变量、静态变量等

栈:函数调用开销,比如局部变量。其内部分配的内存空间地址由高到低越来越小

堆:通过alloc、malloc、calloc等动态分配的空间,其内部分配的内存空间地址由低到高越来越大

内存布局大致如下图:

通过打印地址可以看出内存大致的排序