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

时间:2010-02-10 13:54:32

标签: objective-c cocoa

它只是坐在那里......我如何独立于UI动作运行代码(如同,不仅仅是响应按钮按下)?我正在尝试初始化一些对象并在唤醒.FromNib之前运行一些脚本。我该怎么做呢?

2 个答案:

答案 0 :(得分: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应用程序时,该过程就会退出。

您可能想要阅读我写的this list of important facts about Cocoa and Objective-C。听起来你有一些误解(可能是从你更熟悉的另一个框架中带来的),该列表可以为你清理。

  

如何独立于UI操作运行代码(例如,不仅仅是为了响应按钮按下)?

这取决于你何时尝试这样做。例如,定期行动将是timer的作业。

  

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

您可以在initWithCoder:中执行此操作,该main将发送到从存档(包括您的存档)实例化的每个非视图层对象。 Nibs也是档案馆。

您可能还会考虑成为应用程序委托并实施a applicationWillFinishLaunching: method

第三种方法是将代码填入@autoreleasepool。请注意,除非将其包装在{{1}}语句中,否则此处的任何Cocoa代码都可能会记录“no autorelease pool”警告。其他解决方案没有此问题,因为NSApplication已经为您创建了自动释放池。

答案 1 :(得分:3)

main.m启动应用程序 - 在创建应用程序之前,在nibs加载之前运行的东西将它放在main.m中。