在Cocoa中,main.m类的目的是什么?

4

它只是坐在那里... 如何独立于UI操作运行代码(即不仅响应按钮推送)? 我正在尝试在awakeFromNib之前初始化一些对象并运行一些脚本。我该怎么做?

2个回答

20
在Cocoa中,main.m类的目的是什么?
没有目的。
首先,.m文件不是类。.h也不是。将类的@interface放在.h(头)文件中,将其@implementation放在.m(实现)文件中的做法只是一种约定,仅此而已。这是一个好的约定,但它并不受语言的强制执行。
因此,.m文件包含零个或多个类实现。通常,它恰好是一个。有时候会有两个,其中另一个是小型私有类,其@interface也在同一个文件中。
main.m不包含任何类。它通常只包含一个名为main的函数。
main来自C(Objective-C是其超集),是程序的入口点:它是程序开始运行的地方。所有事情都发生在这里,或者在从这里调用的函数中发生。命令行工具通常也会在这里退出,通过main返回。
大多数Cocoa应用程序中的main函数都是项目模板随附的默认函数;此实现仅简单地尾调用NSApplicationMain,该函数设置共享的NSApplication对象并开始运行。该函数永远不会返回;当用户退出Cocoa应用程序时,进程简单地退出。

我写了一篇关于Cocoa和Objective-C的重要事实清单,你可能想阅读。听起来你有一些误解(可能是从你更熟悉的其他框架带过来的),那个清单可以为你澄清。

如何独立于UI操作运行代码(即不仅在响应按钮推送时)?

这取决于你何时尝试执行它。例如,定期操作将由计时器处理。

我正在尝试在awakeFromNib之前初始化一些对象并运行一些脚本。我该怎么做?

你可以在initWithCoder:中执行此操作,该方法会发送给从存档中实例化的每个非视图层对象,包括你的对象。nib也是存档。

你还可以考虑成为应用程序代理并实现一个applicationWillFinishLaunching:方法

第三种方式是将代码塞到main中。请注意,除非您将其包装在@autoreleasepool语句中,否则这里几乎任何Cocoa代码都可能记录“没有autorelease pool”警告;其他解决方案没有此问题,因为NSApplication已经为您创建了autorelease池。


@Peter关于Cocoa和Objective-C的“重要事实清单”的链接似乎已经移动到http://boredzo.org/cocoa-and-cocoa-touch-intro/。 - mathematrucker
@mathematrucker:啊,我曾经设置了重定向(从/cocoa-intro和/cocoa-touch-intro),但它们可能在服务器迁移中丢失了。感谢您指出这一点。 - Peter Hosey

3

main.m是启动应用程序的文件 - 如果要在nibs加载之前运行某些东西,请将其放置在NSApplication创建之前的main.m中。


你可以指出任何 .m 文件(在任何项目中),只是为了检查一下。我从未见过除了 return UIApplicationMain...; 之外的其他代码行。 - nr5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接