gpt4 book ai didi

objective-c - 为什么 iOS main.m 模板包含返回语句和自动释放池?

转载 作者:技术小花猫 更新时间:2023-10-29 11:24:04 25 4
gpt4 key购买 nike

我正在重新阅读 UIApplicationMain 文档并想知道,如果 UIApplicationMain 永远不会返回,为什么:

  • 最后有return吗?
  • 是否有NSAutoreleasePool

我什至问自己:为什么在 iPhone 上使用 int main(int argc, char *argv[])?我们可以使用命令行启动应用程序吗? argcargv 有什么用?它们是使用过的还是只是遗留的 C?

尊敬的同事们在 Twitter 上发表的一些评论是:

  • return 是给编译器用的
  • NSAutoreleasePool 没用。
  • run loop 需要分配一个自动释放池(与 #2 相矛盾)

最佳答案

1) return 语句可能就在那里,因为编译器不知道该函数永远不会返回(毕竟它没有以任何特殊方式标记)。因此编译器的代码流分析会警告它缺少 return 语句。不过,这仍然不能解释为什么 UIApplicationMain() 有返回值。也许存在错误情况,它实际上可以返回,谁知道呢。

2) 我认为在 main() 中有一个自动释放池 围绕 UIApplicationMain 是错误的,因为没有池释放的任何对象最终都会在这个自动释放池中,它会持续整个持续时间应用。所以实际上对象仍然泄漏。

通常,如果没有自动释放池,运行时会记录一条关于缺少池的错误消息,并告诉开发人员在 _NSAutoreleaseNoPool 上设置断点以查找无池自动释放发生的位置。因此,模板中的顶级 NSAutoreleasePool 实际上对用户隐藏了这种泄漏。

UIApplicationMain() 应该根据需要构建自己的自动释放池(它必须通过事件循环创建和拆除一次池,否则对象只会在外部池中累加,消耗所有内存)。如果有人认为他们真的需要在调用 UIApplicationMain() 之前运行 ObjC 代码(并且他们不能在 applicationDidFinishLaunching: 或类似的方法中做同样的工作),他们总是可以在 UIApplicationMain() 之前创建一个池.由于 UIApplicationMain() 被记录为永远不会返回(如 exit()),因此无论如何让命令跟随它是没有意义的。池永远不会被释放。

如果您查看 Mac 模板,它们实际上没有池。

3) 即使在 Mac 上双击应用程序,也会使用这些参数。操作系统以这种方式将某些信息传递给应用程序。第一个参数是可执行文件启动时的路径,我认为这是在包中查找文件所必需的。在 Mac 上,当从 Finder 启动时,PSN(进程序列号)也作为参数传递给应用程序:

05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 0: /Volumes/RamDisk/MacTestApp-fdcuwfrzopalmgaufwujijhqhvjc/Build/Products/Debug/MacTestApp.app/Contents/MacOS/MacTestApp
05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 1: -psn_0_2220574

关于objective-c - 为什么 iOS main.m 模板包含返回语句和自动释放池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6588211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com