cocoa app main()函数的作用是什么?

cocoa app main()函数的作用是什么?,cocoa,xcode,macos,Cocoa,Xcode,Macos,我正在尝试构建一个超级简单的Cocoa应用程序,它基本上只有一个功能,例如,main和while循环。它做一些事情,做一个curl请求,然后等待几秒钟,然后重新开始 我已经在XCode中设置了我的项目,包含了所有必要的变量和函数,但我不知道将完成所有工作的主函数放在哪里 我在哪里定义主功能?如果你按照通常的Cocoa架构设计你的应用程序,你不会真的把你自己的任何代码放在主功能中。整个应用程序应该是事件驱动的,其中的事件是来自用户的UI交互、网络事件等 也就是说,有一个主要功能。如果您已经在XCo

我正在尝试构建一个超级简单的Cocoa应用程序,它基本上只有一个功能,例如,main和while循环。它做一些事情,做一个curl请求,然后等待几秒钟,然后重新开始

我已经在XCode中设置了我的项目,包含了所有必要的变量和函数,但我不知道将完成所有工作的主函数放在哪里


我在哪里定义主功能?

如果你按照通常的Cocoa架构设计你的应用程序,你不会真的把你自己的任何代码放在主功能中。整个应用程序应该是事件驱动的,其中的事件是来自用户的UI交互、网络事件等

也就是说,有一个主要功能。如果您已经在XCode中创建了一个默认的Cocoa项目,那么main函数将位于一个名为main.m的文件中。它将像C中的主函数一样运行。您将看到其中有一个对NSApplicationMain的调用。这就是启动Cocoa应用程序运行的原因,它创建应用程序,加载主nib文件,开始运行主运行循环,等等。NSApplicationMain在应用程序退出之前不会返回,因此如果您真的想将内容放在main中,则需要将其放在对NSApplicationMain的调用之上


同样,这不是正常的Cocoa做事方式,但是如果没有更多关于你想做什么的信息,就很难给你更多的建议。

如果你按照通常的Cocoa架构设计你的应用程序,你就不会真正把自己的代码放在主代码中。整个应用程序应该是事件驱动的,其中的事件是来自用户的UI交互、网络事件等

也就是说,有一个主要功能。如果您已经在XCode中创建了一个默认的Cocoa项目,那么main函数将位于一个名为main.m的文件中。它将像C中的主函数一样运行。您将看到其中有一个对NSApplicationMain的调用。这就是启动Cocoa应用程序运行的原因,它创建应用程序,加载主nib文件,开始运行主运行循环,等等。NSApplicationMain在应用程序退出之前不会返回,因此如果您真的想将内容放在main中,则需要将其放在对NSApplicationMain的调用之上


同样,这不是正常的Cocoa做事方式,但是如果没有更多关于你想做什么的信息,就很难给你更多的建议。

要补充Andrew Madsen的答案,最好从一个Xcode项目模板开始。它将为您设置一个骨架main、一个XIB、一个plist和其他标准Cocoa内容。

要补充Andrew Madsen的答案,最好从一个Xcode项目模板开始。它将为您设置一个骨架main、一个XIB、一个plist和其他标准Cocoa内容。

Cocoa非常面向事件驱动编程。因此,主函数通常只启动主运行循环,然后应用程序委托就可以启动它想做的任何事情。也就是说,当然可以编写一个非基于事件的cocoa程序,使用main来完成更复杂的工作。在这种情况下,它的工作原理与C中的基本相同


Cocoa With Love刚刚发布了一篇文章,内容可能很有趣。它使用main做一些工作。我并不推荐在你自己的应用程序中进行模拟,但这肯定是可能的。

Cocoa非常倾向于事件驱动编程。因此,主函数通常只启动主运行循环,然后应用程序委托就可以启动它想做的任何事情。也就是说,当然可以编写一个非基于事件的cocoa程序,使用main来完成更复杂的工作。在这种情况下,它的工作原理与C中的基本相同


Cocoa With Love刚刚发布了一篇文章,内容可能很有趣。它使用main做一些工作。这并不是我建议你在自己的应用程序中模仿的东西,但肯定是有可能的。

正如其他人所回答的,你可以用你建议的方式实现你想做的事情,即在main中运行while循环

然而,这并不是编写Cocoa应用程序的最佳方式,它会在几秒钟内重新加载URL一次。在不同的环境中,有不同的标准做事方式。所以,有时候你需要学习你已经习惯了的东西。你可能会想:我想做X。在语言/环境A中,我会像P一样编码来做X。现在我想使用语言/环境B。我应该如何实现P?这不是适应新环境的方式。问一下,我应该如何在环境B中执行X

最具可可风格的方式是:

打开XCode,创建新项目,从模板中选择Cocoa GUI应用程序。 在应用程序委托中,实现ApplicationIDFinishLaunching:。我们将设置一个NSTimer

这将创建一个计时器,该计时器每五秒钟触发一次,每次触发时,它都调用应用程序委托本身的方法timerFired:,由self指定。有关NSTimer的更多信息,请阅读 实现timerFired:

没有第四步


主要功能由模板提供。它调用NSApplicationMain,建立Cocoa系统。最后,它为您调用代理的applicationdFinishLaunching:。你对这个信息做出回应。然后你设置了一个计时器。计时器将调用为您指定的方法。然后你再次回应这个信息。这就是可可的基本原理。可可系统要求你做点什么,所以你做点什么。与在Applescript中编程相比,您对程序流的控制变得相当被动

正如其他人所回答的,可以按照您建议的方式实现您想要做的事情,即在main中运行while循环

然而,这并不是编写Cocoa应用程序的最佳方式,它会在几秒钟内重新加载URL一次。在不同的环境中,有不同的标准做事方式。所以,有时候你需要学习你已经习惯了的东西。你可能会想:我想做X。在语言/环境A中,我会像P一样编码来做X。现在我想使用语言/环境B。我应该如何实现P?这不是适应新环境的方式。问一下,我应该如何在环境B中执行X

最具可可风格的方式是:

打开XCode,创建新项目,从模板中选择Cocoa GUI应用程序。 在应用程序委托中,实现ApplicationIDFinishLaunching:。我们将设置一个NSTimer

这将创建一个计时器,该计时器每五秒钟触发一次,每次触发时,它都调用应用程序委托本身的方法timerFired:,由self指定。有关NSTimer的更多信息,请阅读

实现timerFired:

没有第四步


主要功能由模板提供。它调用NSApplicationMain,建立Cocoa系统。最后,它为您调用代理的applicationdFinishLaunching:。你对这个信息做出回应。然后你设置了一个计时器。计时器将调用为您指定的方法。然后你再次回应这个信息。这就是可可的基本原理。可可系统要求你做点什么,所以你做点什么。与在Applescript中编程相比,您对程序流的控制变得相当被动

嗯,这可能是个问题,因为这不是事件驱动的。它更多的是以无头的方式工作,即不管用户是否做任何事情,事情都会发生。这不一定是个问题。考虑在应用程序的委托类中实现AptudioDIDFixIsPAST方法。当框架的其余部分准备就绪时,这将完成一些工作。有更多的信息。是的,在应用程序中启动IDFinishLaunching是一种有效的方式。我想补充一点,如果您想要任何Cocoa UI,并且需要它工作,即使只是一个退出菜单项,也需要确保运行主运行循环,以便它能够处理传入事件。请参阅nsrunlop文档。否则你的应用程序将需要强制退出才能杀死它。咕哝咕哝强制杀死。。。这正是我想做的。我有一个applescript应用程序,它几乎可以做到这一点基本上,我只是尝试每隔10秒左右用几位数据将一个特定的url卷曲。davethegr8:如果你想让你的应用程序响应退出事件,那么你需要它响应事件,在这一点上它就变成了事件驱动。幸运的是,这与计时器解决方案或使用NSURLDownload或NSURLConnection执行下载/数据检索.Hm并不相互排斥,这可能是一个问题,因为这不是事件驱动的。它更多的是以无头的方式工作,即不管用户是否做任何事情,事情都会发生。这不一定是个问题。考虑在应用程序的委托类中实现AptudioDIDFixIsPAST方法。当框架的其余部分准备就绪时,这将完成一些工作。有更多的信息。是的,在应用程序中启动IDFinishLaunching是一种有效的方式。我想补充一点,如果您想要任何Cocoa UI,并且需要它工作,即使只是一个退出菜单项,也需要确保运行主运行循环,以便它能够处理传入事件。请参阅nsrunlop文档。否则你的应用程序将需要强制退出才能杀死它。咕哝咕哝强制杀死。。。这正是我想做的。我有一个applescript应用程序,它几乎可以做到这一点基本上,我只是尝试每隔10秒左右用几位数据将一个特定的url卷曲。davethegr8:如果你想让你的应用程序响应退出事件,那么你需要它响应事件,在这一点上它就变成了事件驱动。幸运的是,这与计时器解决方案或使用NSURLDownload或NSURLConnection进行下载/数据检索并不相互排斥。请看,这就是我喜欢这样做的原因。一个复杂问题的完整答案,我不知道如何恰当地提问,这让我到达了我需要的地方。你说的完全正确
e改变环境也是一件很重要的事情,所以谢谢你给我一个好的模板来问未来的问题。看,这就是为什么我喜欢这样。一个复杂问题的完整答案,我不知道如何恰当地提问,这让我到达了我需要的地方。你对不断变化的环境的看法也是完全正确的,所以谢谢你给我一个好的模板,让我可以在将来提问。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
      NSTimer*timer=[NSTimer scheduledTimerWithTimeInterval:5
                                                     target:self 
                                                   selector:@selector(timerFired:)
                                                   userInfo:nil
                                                    repeats:YES];
}
- (void)timerFired:(NSTimer*)theTimer{
      // do whatever you want. you can use plain C to invoke curl, 
      // or if you want you can use Cocoa methods to access a URL.
}