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 破除循环引用的办法,必须要口述出来
网友评论