创建iOS应用程序时主循环在哪里?

时间:2012-07-06 13:15:25

标签: objective-c ios main

我在Xcode中为iPhone编写了一个iOS应用程序,我在各自的.h和.m文件中创建了一些类及其方法(这是两个类,所以基本上我有两对.h&。 m文件)

我现在想开始编写主循环,只要用户点击播放按钮就会执行,但我到底在哪里做?

我是否在ViewController.m中执行此操作?例如在这个方法里面:

- (IBAction)playPressed:(UIButton *)sender 
{
    // main loop executed in here ?
    // or simply message to the main loop to start executing is *sent* from here ?
}

我在这里读到了类似的问题,有人建议AppDelegate。现在是AppDelegate.m还是AppDelegate.h?如果是这种情况,我只是开始编写代码,还是将所有内容包括在内:

int main(int argc, char **argv)
{
   ....
}
Appdelegate文件中的

我试图在我创建的game.m文件中简单地开始实例化类并声明泛型方法(不属于任何特定的类...),我得到一个 初始化元素不是编译我尝试实例化任何内容时立即停止 警告

有任何帮助吗?来自c ++,它真的可以帮助我一劳永逸地澄清哪个文件准确地编写我的主循环,以及是否应该将它包装在某种int main()函数中。

谢谢!

PS:

为了防止它有任何区别,我的ViewController将只包含一个播放按钮,它会在按下时启动主循环的执行,以及一个终止主循环执行的停止按钮

我在ViewController.m中创建了各自的方法:

- (IBAction)playPressed:(UIButton *)sender 
{
    // 
}

- (IBAction)stopPressed:(UIButton *)sender 
{
    //  ??
}

暂时是空的:)

3 个答案:

答案 0 :(得分:1)

每个iOS应用程序以及每个可执行文件都有一个入口点 - 这是main()。您不能拥有多个可执行文件的入口点。如果仔细查看项目,您会看到Xcode导航器中的main.m组中有一个自动生成的Supporting Files文件,看起来像这样:

#import <UIKit/UIKit.h>

#import "MyAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

你想做的事情还不够清楚,但是阅读iOS应用程序的结构和生命周期,Objective-c语法,熟悉UIKit以及至少一些框架是一个良好的开端Apple提供。

答案 1 :(得分:1)

你在iOS应用程序中没有main(从技术上讲,你确实有一个主要的,但你不必担心写它)。这一切都是为你处理的。 runloop也是为你完成的。您所要做的就是创建按钮,然后告诉它(通过addTarget方法)按下时要运行的方法。

更新: 这是你需要做的伪(ish)代码....

[startButton addTarget:@selector(startPressed:)];
[stopButton addTarget:@selector(stopPressed:)];

-(void)startPressed {
  backgroundThread = [[NSThread alloc] initWithWhateverYouWantToRun];
  [backgroundThread start];
}

-(void)stopPressed {
  [backgroundThread stop];
}

在你的后台主题中,如果你想更新用户界面,你可以打电话给sendMessageOnMainThread(或者类似的东西 - 暂时不记得确切的细节!)

答案 2 :(得分:1)

iOS上的编程方法与C ++方法不同。  实际上,在C ++中,您必须在每个帧上进行无限循环并获取触摸,绘制所有内容等。  直到玩家按下&#34;退出&#34;你打破了循环。  在iOS上,事情有所不同:  您已经有一个main.m文件,其中有一个main函数。  这启动了应用程序代理。该应用代表告诉您应用程序何时完成启动,转到后台,进入前台等。  当应用程序完成启动时,您将转到第一个实际屏幕。  在那里,你添加了子视图。你不能在每一帧画出它们。将视图添加到父视图后,将自动完成此操作。  iOS上的编程基于事件。你不必检查接触,看看是否有  触摸位置在按钮上,然后调用该按钮的方法。  相反,您为按钮设置了一个回调方法,并在按下按钮后自动为您调用。  当然,您首先需要分配按钮并将其添加到父视图中。

一旦你习惯了这个基于事件的编程模型,你肯定会喜欢它。  在开始时它可能会非常不同,也许它对你没有意义,但不要担心。  来自C ++背景肯定是一个良好的开端。

干杯,

乔治

编辑:在这种情况下,我可以提供更具体的信息: 所以,你在第一个屏幕上从AppDelegate开始。我们称之为MainAppScreen。 现在,您需要为它们添加这两个按钮并设置选择器(回调方法)。我可以看到你已经做到了。

现在:

- (IBAction)playPressed:(UIButton *)sender
{
    running = TRUE;
    [self performSelectorInBackground:@selector(myLoop) withObject:nil];
}
- (IBAction)stopPressed:(UIButton *)sender 
{
    running = FALSE;
}
- (void) myLoop
{
    while(running)
    {
       //this is your loop. You can code in here.
    }
}

其中running是MainAppScreen类中的实例变量。

希望这有帮助。

干杯!