iOS中可能会出现的内存问题:
CADisplayLink、NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用
解决方案:
通过使用代理可以让proxy弱引用持有控制器,从而更好避免出现循环引用的问题
GCD定时器封装:
nNSTimer依赖于RunLoop,如果RunLoop的任务过于繁重,可能会导致NSTimer产生延迟
可以使用GCD的定时器,避免偏差,以下是GCD定时器的简单封装
iOS程序中的内存布局:
代码段:编译之后的代码
数据段包括:
字符串常量:如NSString *str = @"xxx"
已初始化数据:已初始化的全局变量、静态变量等
未初始化数据:未初始化的全局变量、静态变量等
栈:函数调用开销,比如局部变量。其内部分配的内存空间地址由高到低越来越小
堆:通过alloc、malloc、calloc等动态分配的空间,其内部分配的内存空间地址由低到高越来越大
内存布局大致如下图:
通过打印地址可以看出内存大致的排序