美文网首页
最常见的runloop面试题

最常见的runloop面试题

作者: 动感新势力fan | 来源:发表于2016-04-05 22:13 被阅读109次

主线程的RunLoop是默认开启的(视图用[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]来停止它,也是做不到的), 每一次消息循环开始的时候会先创建自动释放池,这次循环结束前,会释放自动释放池,然后RunLoop等待下次事件源。 在这个过程中,由RunLoop创建的释放池类似于一个全局的释放池。但是开发者可以任何执行的地方创建释放池,也就是局部的释放池,这时的释放池类似于代码块 当释放池结束的时候会自动释放。因此一般情况下,局部的自动释放池很快就被释放了,而RunLoop释放池会等一次消息循环结束的时候释放。

当我们使用for循环创建很多个使用autorelease方式创建的NSString对象的时候,将所有的对象的释放权都交给了RunLoop 的释放池,而RunLoop的释放池会等待这个事件处理之后才会释放,因此就会使对象无法及时释放,堆积在内存造成内存泄露,可以在Debug Navigation 中观察到内存激增。为了验证确实是因为autorelease这种创建方式引起的内存泄露,我做了如下的测试:

int largeNumber = 1000000;
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    for (int i = 0 ; i < largeNumber; i++) {
        
//           @autoreleasepool {
        NSNumber *num = [NSNumber numberWithInt:i];
        NSString *str = [NSString stringWithFormat:@"%d ", i];
        
        //Use num and str...whatever...
        [NSString stringWithFormat:@"%@%@", num, str];
//           }
    }

}

结果:

屏幕快照 2016-04-05 23.17.39.png
int largeNumber = 1000000;
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    for (int i = 0 ; i < largeNumber; i++) {
        
         @autoreleasepool {
        NSNumber *num = [NSNumber numberWithInt:i];
        NSString *str = [NSString stringWithFormat:@"%d ", i];
        
        //Use num and str...whatever...
        [NSString stringWithFormat:@"%@%@", num, str];
           }
    }

}

结果:

屏幕快照 2016-04-05 23.19.39.png

如果将局部释放池添加到循环外:

int largeNumber = 1000000;
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

         @autoreleasepool {
     for (int i = 0 ; i < largeNumber; i++) {
        NSNumber *num = [NSNumber numberWithInt:i];
        NSString *str = [NSString stringWithFormat:@"%d ", i];
        
        //Use num and str...whatever...
        [NSString stringWithFormat:@"%@%@", num, str];
           }
    }

}

结果:没效果

新事件 点击了两次


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"q");
    for (int i = 0 ; i < largeNumber; i++) {
        
        
        NSNumber *num = [NSNumber numberWithInt:i];
        NSString *str = [NSString stringWithFormat:@"%d ", i];
        
        //Use num and str...whatever...
        [NSString stringWithFormat:@"%@%@", num, str];
    }
}

结果:

屏幕快照 2016-04-05 23.23.33.png

相关文章

  • iOS底层面试题--RunLoop

    什么是RunLoop? iOS底层面试题--RunLoop RunLoop面试题分析

  • 面试总结

    iOS面试题相关 原理部分runloop mode、常见用法内存管理 autoreleasepool如何释放,怎么...

  • iOS RunLoop 总结以及相关面试题解答

    iOS RunLoop 总结以及相关面试题解答 iOS RunLoop 总结以及相关面试题解答

  • runloop 介绍

    iOS面试题之runloop 阅读目录 1.runloop是什么/runloop的概念? 2.NSRunLoop ...

  • runloop 面试题

    runloop 面试题 基于最近的几次面试,整理了runloop 的相关知识 1、Runloop 是什么?Run ...

  • RunLoop数据结构、RunLoop的实现机制、RunLoop

    推荐阅读:备战2020——iOS全新面试题总结 RunLoop概念 RunLoop的数据结构 RunLoop的Mo...

  • 探寻RunLoop的本质

    iOS底层原理总结 - RunLoop 面试题 讲讲 RunLoop,项目中有用到吗? RunLoop内部实现逻辑...

  • iOS底层原理总结 - RunLoop

    面试题 讲讲 RunLoop,项目中有用到吗? RunLoop内部实现逻辑? Runloop和线程的关系? tim...

  • 浅谈RunLoop

    面试题 讲讲runloop,项目中有用到吗? runloop内部实现逻辑 runloop和线程的关系 timer和...

  • RunLoop

    面试题 讲讲 RunLoop,项目中有用到吗? RunLoop内部实现逻辑? Runloop和线程的关系? tim...

网友评论

      本文标题:最常见的runloop面试题

      本文链接:https://www.haomeiwen.com/subject/nxgplttx.html