ios 经典面试案例 (三)

1、xcode在 release 模式下断点调试, 对象在打印的时候有值,断点调试却没值, 这是怎么回事?

答:

xcode release 模式下 默认如下配置,关掉断点时候读取变量的上下文环境,以提高运行速度

如图:

image

解决方式, 值需要设置成None就行了

image

2、不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?(比如在一个vc的viewDidLoad中创建)

答:

分两种情况:手动干预释放时机、系统自动去释放。

1. 手动干预释放时机—指定autoreleasepool 就是所谓的:当前作用域大括号结束时释放。

2. 系统自动去释放—不手动指定autoreleasepool

Autorelease对象出了作用域之后,会被添加到最近一次创建的自动释放池中,并会在当前的 runloop 迭代结束时释放。

释放的时机总结起来,可以用下图来表示

image

从程序启动到加载完成是一个完整的运行循环,然后会停下来,等待用户交互,用户的每一次交互都会启动一次运行循环,来处理用户所有的点击事件、触摸事件。

我们都知道: 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中。

3.如果每次都放进应用程序的 main.m 中的 autoreleasepool 中,迟早有被撑满的一刻。这个过程中必定有一个释放的动作。何时?

答:在一次完整的运行循环结束之前,会被销毁。

4.什么时间会创建自动释放池?

答:

A:运行循环检测到事件并启动后,就会创建自动释放池。

B:子线程的 runloop 默认是不工作,无法主动创建,必须手动创建。(拓展:run loop和线程是紧密相连的,可以这样说run loop是为了线程而生,没有线程,它就没有存在的必要。Run loops是线程的基础架构部分)

C:自定义的 NSOperation 和 NSThread 需要手动创建自动释放池。比如: 自定义的 NSOperation 类中的 main 方法里就必须添加自动释放池。否则出了作用域后,自动释放对象会因为没有自动释放池去处理它,而造成内存泄露。

但对于 blockOperation 和 invocationOperation 这种面默认的Operation ,系统已经帮我们封装好了,不需要手动创建自动释放池。

@autoreleasepool 当自动释放池被销毁或者耗尽时,会向自动释放池中的所有对象发送 release 消息,释放自动释放池中的所有对象。

如果在一个vc的viewDidLoad中创建一个 Autorelease对象,那么该对象会在 viewDidAppear 方法执行前就被销毁了。

题的搬运,不成敬意!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 有位年轻人,管他叫小李。外表上看起来像书呆子,衣着得体,平时都戴副眼镜。 从外观上看,似乎都会认为是典型的宅...
    _刘建宏_阅读 208评论 0 1
  • 好久没打开过简书了,是的,我又堕落了,眼睛跟着游戏在转,手跟着鼠标在走。今天再次打开简书,是因为真的感受到了那些好...
    默飞柳燃墨阅读 153评论 0 0
  • 晚上和妹妹的朋友们去文化路北段的百度K歌了,相距上一次和老同学们去玩有很久了,那是五一节时有几个同学从外地赶回来相...
    湍河故事阅读 281评论 0 0