第七篇:Objective-C 知识回顾内存管理之二

7.1.自动释放池

问题一:思考如下代码,array是什么时候被释放的?
- (void)viewDidLoad {
    [super viewDidLoad];
    //1.思考如下代码,array是什么时候被释放的?
    NSMutableArray *array = [[NSMutableArray alloc] init];
    NSLog(@"%@", array);
}
  • 在当次 runloop 将要结束的时候调用 AutoreleasePoolPage::pop(),会给 array 对象发送一个 release 的信号,从而释放掉。
问题二:AutoreleasePool 的实现原理是怎么样的?
问题三:AutoreleasePool 为何可以嵌套使用呢?
  • 多层嵌套调用就是多次插入哨兵对象。
问题四:AutoreleasePool 的使用场景或者说什么时候需要手动创建?
  • 在 for 循环中 alloc 图片数据等内存消耗较大的场景,手动插入 autoreleasePool,每一次 for 循环都对内存进行一次释放,来降低内存的使用峰值。防止一些内存消耗过大从而导致的一些问题。
autoreleasePool
自动释放池的两个基本概念
双向链表的结构图
栈结构的复习
AutoreleasePoolPage 的结构
AutoreleasePoolPage::push方法调用过程
autorealse 的系统内部流程
AutoreleasePoolPage::pop 大致流程

7.2.循环引用

问题一:思考循环引用有哪几种?
  • 自循环引用
  • 相互相互引用
  • 多循环引用
问题二:思考如何破除循环引用?
  • 避免产生循环引用
  • 在合适的时机手动断环
问题三:思考解决循环引用的具体方案有哪些?
  • __weak (在使用 delegate 和 block 的时候经常使用到)
  • __block (一般用在 block 方面产生的循环引用问题)
  • __unsafe__unretained (由这个关键字修饰的对象,不会增加引用计数)
问题四:思考__block 会在 MRC 和 ARC 下的表现?
  • MRC 下,__block 修饰对象不会增加其引用计数,避免了循环引用
  • ARC 下,__block 修饰对象会被强引用,无法避免循环引用,需手动解环
问题四:思考 __unsafe__unretained 的使用注意事项?
  • 修饰对象不会增加其引用计数,避免了循环引用。
  • 如果被修饰对象在某一时机被释放,会产生悬垂指针。
思考图中循环引用的点,需要都能有具体代码场景出来
问题五:思考在日常的开发工作中,你是否遇到了循环引用,你是怎么解决的?
NSTimer 破除循环引用的办法,必须要口述出来

推荐阅读更多精彩内容

  • Ping++SDK:一次申请开通多个支付渠道,一次接入所有平台和支付方式 需要传递三个参数:api key应用id...
    BURIBURI_ZAEMON阅读 1,947评论 0 11
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 3,553评论 0 12
  • 现在iOS开发已经是ARC甚至是swift的时代,但是内存管理仍是一个重点关注的问题,如果只知盲目开发而不知个中原...
    码代码的小马阅读 98评论 0 1
  • iOS的内存管理是采用引用计数的方式,引用计数分为手动引用计数和自动引用计数(ARC)。前者要求开发者手动管理内存...
    还是不够辣阅读 199评论 0 3
  • 为什么进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时...
    天天想念阅读 304评论 1 7