Date
Nov. 21st, 2024
 
2024年 10月 21日

Post: iOS 入门 009: autoreleasepool自动释放池

iOS 入门 009: autoreleasepool自动释放池

Published 12:04 Apr 10, 2012.

Created by @ezra. Categorized in #Programming, and tagged as #iOS.

Source format: Markdown

Table of Content

autoreleasepool自动释放池

问答

  • 自动释放池的作用是什么?

    • 延迟释放
  • 那些对象会延迟释放?

    • 所有用类方法实例化的对象都是延迟释放的
  • 对象何时被销毁?

    • 所有延迟释放的对象在超出作用域之后会被添加到最新创建的自动释放池中,但是不会被立即销毁,当自动释放池被销毁时,会向池中所有对象发送release消息,释放所有延迟释放的对象
  • 自动释放池何时被销毁?

示意图

iPhone Application Launches > iPhone Touch Event > Cocoa Touch Creates Event > Event Object
⬆️ ⬇️ ⬇️
⬆️ > Autorelease Pool < Cocoa Touch Creates Autorelease Pool
Application Object(s) ⬅️ ⬇️
Application Handles Event <
Cocoa Touch Darins Autorelease Pool <
  • 自动释放池在ARC中工作吗?

    • 工作,编译器在编译时会根据代码添加retainreleaseautorelease

面试题

题目

  • 以下代码是否有问题,如果有该如何修正?

题目

int largeNo = 2 * 1024 * 1024;
for (int i = 0;i < largeNo;i++){
    NSString *str = [NSString stringWithFormat:@"Hello"];
    str = [str uppercaseString];
    str = [str stringByAppendingString:@" World"];
}

答案

  • 每一次都会实例化新的str,超出作用域之后会被添加到自动释放池中,如果循环次数很多,会在一次循环之后把自动释放池耗尽

解决

int largeNo = 2 * 1024 * 1024;
@autoreleasepool { // 放在外面,保证循环之后释放循环中的自动释放对象
    for (int i = 0;i < largeNo;i++){
        //@autoreleasepool {
        // 放在内部,每一次循环之后,都倾倒一次自动释放池,内存管理时最好的,但性能不好
            NSString *str = [NSString stringWithFormat:@"Hello"];
            str = [str uppercaseString];
            str = [str stringByAppendingString:@" World"];
        //}
    }
}
Pinned Message
HOTODOGO
The Founder and CEO of Infeca Technology.
Developer, Designer, Blogger.
Big fan of Apple, Love of colour.
Feel free to contact me.
反曲点科技创始人和首席执行官。
开发、设计与写作皆为所长。
热爱苹果、钟情色彩。
随时恭候 垂询