刀哥多線程自動釋放池autoreleasepool

自動釋放池

  • 作用

    • 自動釋放對象的
    • 所有 autorelease 的對象,在出了作用域之後,會被自動添加到最近創建的自動釋放池中
    • 自動釋放池被銷燬或者耗盡時,會向池中所有對象發送 release 消息,釋放池中對象
    • 自動釋放池,在 ARC & MRC 程序中,同樣有效

高級面試題:

  • 自動釋放池是什麼時候創建的?什麼時候銷燬的?

  • 創建,運行循環檢測到事件並啓動後,就會創建自動釋放池

  • 銷燬:一次完整的運行循環結束之前,會被銷燬

  • 常見面試題
for (long i = 0; i < largeNumber; ++i) {
    NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
    str = [str uppercaseString];
    str = [str stringByAppendingString:@" - world"];
}
  • 提問:以上代碼是否有問題?如果有,如何解決?

  • 解決方法:引入自動釋放池

    • 1> 外面加自動釋放池(快):能夠保證for循環結束後,內部產生的自動釋放對象,都會被銷燬
      需要等到 for 結束後,纔會釋放內存
    • 2> 裏面加自動釋放池(慢):能夠每一次 for 都釋放產生的自動釋放對象!
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    NSLog(@"start");
    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
    [self answer1];
    NSLog(@"外 %f", CFAbsoluteTimeGetCurrent() - start);

    start = CFAbsoluteTimeGetCurrent();
    [self answer2];
    NSLog(@"內 %f", CFAbsoluteTimeGetCurrent() - start);
}

- (void)answer1 {
    @autoreleasepool {
        for (long i = 0; i < largeNumber; ++i) {
            NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
            str = [str uppercaseString];
            str = [str stringByAppendingString:@" - world"];
        }
    }
}

- (void)answer2 {
    for (long i = 0; i < largeNumber; ++i) {
        @autoreleasepool {
            NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
            str = [str uppercaseString];
            str = [str stringByAppendingString:@" - world"];
        }
    }
}
  • 實際測試結果,是運行循環放在內部的速度更快!
  • 日常開發中,如果遇到局部代碼內存峯值很高,可以引入運行循環及時釋放延遲釋放對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章