惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
C
Check Point Blog
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
SecWiki News
SecWiki News
有赞技术团队
有赞技术团队
Latest news
Latest news
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
Project Zero
Project Zero
H
Help Net Security
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
GRAHAM CLULEY
Engineering at Meta
Engineering at Meta
T
Threat Research - Cisco Blogs
腾讯CDC
P
Proofpoint News Feed
L
LINUX DO - 热门话题
C
Cisco Blogs
P
Palo Alto Networks Blog
Vercel News
Vercel News
P
Privacy International News Feed
爱范儿
爱范儿
Scott Helme
Scott Helme
L
Lohrmann on Cybersecurity
MyScale Blog
MyScale Blog
K
Kaspersky official blog
B
Blog RSS Feed
美团技术团队
Microsoft Security Blog
Microsoft Security Blog
O
OpenAI News
博客园 - 叶小钗
量子位
T
Tenable Blog
C
Cybersecurity and Infrastructure Security Agency CISA
J
Java Code Geeks
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News: Ask HN
Hacker News: Ask HN
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LINUX DO - 最新话题
F
Fortinet All Blogs
N
News | PayPal Newsroom
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 【当耐特】
N
News and Events Feed by Topic
V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
Last Week in AI
Last Week in AI

一个工匠

AI 发展临界点 - 快上车 流式响应(Chat):HTTP 响应体字节流的读取与解析 iPhone 截屏高效翻译 Flash Open Terminal iPhone 侧载安装 Xcode Symbolic Debug AI 指北 投资风险收益评估 Mac 快速修改系统快捷键 Git Record passkey How to pay apple frameworks Mac - Command Line Tools DNS 的 CNAME 是如何工作的 WebRTC 的一些解释 SSE 指南 1.1.1.1、WARP 和 MASQUE 移动端换端方案与场景还原 设备发现 分辨率 - 像素密度 - HiDPI Mac 字体 ESP32 trump - 川普 币圈 - 虚拟货币 【旅游】富士山 【旅游】sakura(樱花) 【旅游】千岛湖 我的 2023 【Swift】中文词语纠错 计算机字符编码与内存编码 - Unicode、UTF8、String 从汇编角度理解 “函数调用栈” 和 “有栈协程” 在 Xcode 中更好的使用 Swift 通过 Swift Package 制作二进制库 Arc 浏览器 - 意外的惊喜 【Swift 三方源码 1】SwiftShell 高效的命令行工具 Swift 脚本开发环境搭建 rime - 小鹤双拼 【旅游】沿海旅游 (威海、青岛) 好记性远远不如烂笔头 高级语言小记 又一年高考 Vision 未来已来 致敬耗子哥 Socket 与 ICMP 对互联网隐私的一些想法 网络代理是如何工作的 (致敬 Surge) 又十年 - 至三十而立 双拼 - 少有的高回报效率技能 Vim 技巧 我的 2022 三年疫情五味杂陈 - 下 老梗 - 浏览器按回车后发生了什么 三年疫情五味杂陈 生活推荐清单 Shell 和进程 有计划的努力 内卷 不确定性 数学可以保障逻辑自洽 这些年我的软件清单 决定做一些改变 函数调用栈之彻底理解 锁 - 共享数据安全指↑ 江苏女有感 碎碎念 - 2022 碎碎念 - 2021 打算记录一些碎碎念 多重性格就是逆天改命 从 Core Foundation 看更大世界 TCP 数据传输过程分析 多线程的难点在哪里 Objective-C 和 Runtime 早起打卡计划 ing 打比方 IM 和 Socket 的关系及 Heart 的必要性 如果我的人生突然只剩下 8 小时... 胡说八道之雪粉 Array 和 LinkedList 的深刻认知 Swift struct (值类型) 与 class (引用类型) 区别及三种传参机制深刻关系和使用 逃离信用卡和花呗 Swift_let_var_struct_class 网聚人的力量 - 网易 绿皮火车 喝酒十之八九会误事 HKong 胡说八道之云服务 互联网网络传输协议理解坑点 CPU 的制作 我心里一直有一个念想 网络基础协议 为什么 32 位操作系统只能用 4G 内存空间 努力和天赋 洗牙 RAC-Api-Summer iOS 内存原理 Block 闭包简查记录 《白夜行》 谈谈事件驱动 老博新开 祭首
iOS main 文件中的 @autoreleasepool 的真实用途
海驴 · 2020-05-05 · via 一个工匠

这个问题,在很多年前其实是经历过血腥风雨的。

就是下面的代码,Xcode 创建项目的时候,会生成下面的 main.mm 文件:

1
2
3
4
5
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

问题就是,main 里面的 autoreleasepool 是做什么用的?

前几年是 iOS 炙手可热的疯狂年代,面试官们会经常问到这个问题,后来,这个问题后来越来越淡了,因为没有人能回答的好它。
甚至于,能回答这个问题的人,都是瞎扯淡,我可以这样确认。

这个问题,我曾经研究过很久,我把可能的牵强逻辑都灌进去,也无法得出结论。那时我给自己的答案是:
我确认这个 autoreleasepool 没有任何用处,不管别人怎么说,除非拿出实锤,否则我确定它没任何用途。
苹果是一家特别的公司,不会恶意强奸用户,所以我相信它有特别的用处,但是我不知道是啥。

显然,这是一个两面派的答案。一来我相信自己的逻辑判断,二来我相信苹果一定别有用途。

我本以为这个问题,至少有经验的 iOS 开发一定不会问,因为问就是自讨没趣,这是一个没有答案的问题。
如果有人能给出答案,那就像回答” 鲁迅写的那个字妙在哪,体现了他当时什么心情 “一样的天马行空,我可以确认能回答出来的答案绝对是天马行空的。

显然,我写这个文章的原因,是有人问了。
我甚至听到这个问题的时候,以为这个已经被淡忘好多年的经历过血腥风雨的问题又要卷土重来一遍。

我按捺不住自己的复杂心情,又打开了 google,想看看最近是不是又有什么新的傻逼讲解出来了。
显然,我依旧一无所获。

那种不死心,很多时候是天生的,我在 5 月 5 号,写下文章标题,用来激励自己,这次,一定要找到答案。
中间断断续续的,把相关书籍的部分章节重点看看,把 OC 相关源码重点看看,和同事聊聊聊,一直到今天,5 月 9 号。

我想看看 Xcode 创建 Mac 项目的 main 文件长啥样,如下:

1
2
3
4
5
6
7
// Mac app
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
}
return NSApplicationMain(argc, argv);
}

反正我立刻就惊了,Mac 和 iOS 的 main 文件竟然是不一样的。我立刻创建一个 iOS 项目,如下:

1
2
3
4
5
6
7
8
9
// iOS app
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}

我当场就笑了。

不知道 Xcode 的哪个版本开始就改变了项目的 main 初始代码,至少,我一直没有注意它。

这个能够引发血腥风雨和奇思淫计的问题,总算可以成为历史了。

现在如果有人问 “main 文件中的 @autoreleasepool 的用途”,就是光明正大的问自动释放池的释放原理了。