autoreleasepool

objc使用什么机制管理对象内存?

通过 retainCount 的机制来决定对象是否需要释放。 每次 runloop 的时候,都会检查对象的 retainCount,如果retainCount 为 0,说明该对象没有地方需要继续使用了,可以释放掉了。

ARC通过什么方式帮助开发者管理内存?

ARC相对于MRC,不是在编译时添加retain/release/autorelease这么简单。应该是编译期和运行期两部分共同帮助开发者管理内存。
在编译期,ARC用的是更底层的C接口实现的retain/release/autorelease,这样做性能更好,也是为什么不能在ARC环境下手动retain/release/autorelease,同时对同一上下文的同一对象的成对retain/release操作进行优化(即忽略掉不必要的操作);ARC也包含运行期组件,这个地方做的优化比较复杂,但也不能被忽略。

一个autorealese对象在什么时刻释放?

1、AutoRelease对象出了作用域之后,会被添加到最近一次创建的自动释放池中,并会在当前runloop迭代结束时释放。本质上说本次runloop迭代结束时清理到本次迭代期间内被放到autorelease pool中的对象。

2、一个autorealese对象在什么时刻释放?分两种情况:手动干预释放时机–指定autoreleasepool 就是所谓的:当前作用域大括号结束时释放。系统自动去释放。

3、创建自动释放池的时机?运行循环检测到事件并启动后,就会创建自动释放池。

4、子线程默认是没有Runloop的,编程人员在调用 [NSRunLoop CurrentRunLoop] 时,是以懒加载的形式自动创建 RunLoop 的,而没法手动创建。

5、arc下使用@autoreleasepool{} 的意义?

 // 其中如果字符串的数量少于10个,字符串会存放到常量区,所以无论你for多少次,少于10个字符串的对象在内存只生成一次。
 //反之,字符串的数量大于或等于10个的时候,就会在堆区生成1024*1024*30个内存对象。

for (int index = 0; index < 30 * 1024 * 1024; index ++) {
    // 产生大量临时变量时,避免内存使用峰值过高,及时释放内存。
    NSString * str = [NSString stringWithFormat:@"0123456789"];
}

for (int index = 0; index < 30 * 1024 * 1024; index ++) {
    @autoreleasepool {
        NSString * str = [NSString stringWithFormat:@"0123456789"];
    }
}