Date
Jul. 14th, 2024
 
2024年 6月 9日

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
I'm looking for a SOFTWARE PROJECT DIRECTOR / SOFTWARE R&D DIRECTOR position in a fresh and dynamic company. I would like to gain the right experience and extend my skills while working in great teams and big projects.
Feel free to contact me.
For more information, please view online résumé or download PDF
本人正在寻求任职 软件项目经理 / 软件技术经理 岗位的机会, 希望加⼊某个新鲜⽽充满活⼒的公司。
如有意向请随时 与我联系
更多信息请 查阅在线简历下载 PDF