Cyr*_*roy 9 cocoa-touch objective-c ios
我正在重新阅读UIApplicationMain文档,并想知道,如果UIApplicationMain永远不会返回,为什么:
return在结束了吗?NSAutoreleasePool吗?我甚至问自己:为什么int main(int argc, char *argv[])在iPhone上?我们可以使用命令行启动应用程序吗?什么是argc和argv为什么?它们是使用还是只是遗留C?
来自尊贵的研究员的推特上的一些评论是:
return 在这里为编译器NSAutoreleasePool是没用的.1)return语句可能就在那里,因为编译器不知道该函数永远不会返回(毕竟它没有以任何特殊的方式标记).所以编译器的代码流分析会警告它有一个缺少的return语句.但这仍然无法解释为什么UIApplicationMain()具有返回值.也许有一个错误的情况,它实际上可以返回,谁知道.
2)我认为在UIApplicationMain周围的 main()中有一个自动释放池是错误的,因为没有池释放的任何对象都会在这个自动释放池中结束,该池在应用程序的整个持续时间内持续存在.因此有效的对象仍然泄露.
通常,如果没有自动释放池,运行时会记录有关丢失池的错误消息,并告诉开发人员在_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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
965 次 |
| 最近记录: |