当另一个已经启动时,让课程在后台运行

时间:2011-10-06 09:40:43

标签: iphone objective-c user-interface

如果我在这里有这个代码,我会尝试尽可能地解释这个

ViewTwoController *home = [[ViewTwoController alloc] initWithNibName:@"contentscreen" bundle:nil];
[self presentModalViewController:home animated:YES];
[home release];

我将开始一个新的.m和.h课程。然而,我想尝试做的是,在调用它时,使用.m和.h类,在后台运行调用它,这样我就不会丢失数据。

我能想到的最好的例子是Android。如果你开始一个新类,并且没有在调用的类中添加finish()语句,那么前一个类在当前类后面运行(被推到前面)并维护它最初的所有数据,所以如果你点击一个返回按钮,你会看到你刚才收到的信息。这可能吗?如果人们无法理解我想要做什么,我可以尝试添加更多细节。

4 个答案:

答案 0 :(得分:1)

你需要更好地理解对象的生命周期。

一个对象通常以2部分进程存在。

  1. 分配 - (抓取对象及其成员的内存)
  2. 初始化 - (设置对象使用)
  3. 这可以与+new类方法合并为一步,该方法结合了allocinit

    让我们介绍一个名为MyClass的示例类,以及该类的一个名为myObject的对象。按照惯例,类以大写字母开头,对象以小写字母开头。所以不用多说,一些代码:

    MyClass * myObject;
    

    这会产生一个对象指针,但不会为它分配任何内存或指示指针引用任何内容。

    myObject = [[MyClass alloc] init];
    

    这实际上创建了MyClass的实例,将-init消息传递给它,然后将init消息的返回值分配给myObject。此时此对象的引用计数为1.

    myObject可能会超出范围,但仅此一项不会释放alloc步骤中分配的内存。

    为了释放该内存,需要将释放消息传递给该对象。

    [myObject release];
    

    释放的效果是减少引用计数,如果引用计数已经为1,则对象将传递-dealloc,表示它实际上已被释放。

    回到你的问题......基本上[self presentModalViewController:home animated:YES];最终会在-retain上调用home,这样在解除模态视图控制器之前它不会被销毁。在调用release或autorelease时有效,你不会释放对象,只是告诉对象:
    “嘿,我不再需要你了,如果没有其他人做,那么就把你早先抓住的所有记忆释放出来。”

答案 1 :(得分:0)

您的问题与“在后台运行的课程”无关,但与您管理数据的方式有关。

答案 2 :(得分:0)

当您呈现模态视图控制器时,其父级(您从中呈现的视图控制器)不会被销毁(除非您专门发布它,否则可能会在以后崩溃您的应用程序)。所以,如果你想知道它是否还在记忆中;它是。至于仍在运行的任务,它取决于这些任务是什么。例如,您仍然可以向其发送消息(调用方法),并且很乐意从您或代理处接收这些消息,并在屏幕外执行任何操作。

希望有所帮助。

答案 3 :(得分:0)

在这种情况下,您将呈现新的视图控制器。主线程将在新控制器中呈现。如果您希望在上一个视图控制器中在后台运行某些内容,则可以创建后台线程。这可以使用[self perfomselectorInThebackground ...]或其他一些方法来完成,比如GCD。 (主要的是你不应该阻止主线程)