关于在新线程上运行进程的新手问题

时间:2011-05-17 02:42:32

标签: iphone nsthread

到目前为止,我的应用程序非常简单,但现在我发现我需要在一个单独的线程上运行一个进程,所以这是一个xCode 101问题,询问我是如何做到的。

我想运行一个在应用启动时运行的进程,所以我想在AppDelegate.applicationDidFinishLaunching中执行它。

从我读过的内容来看,我认为这就是我需要做的一切,但如果我错了,请纠正我。

// *** AppDelegate.m ****

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    [NSThread detachNewThreadSelector:@selector([XMLParser parseXML:]) 
        toTarget:self
        withObject:requestStr];

}

// *** XMLParser.m ***

-(void)parseXML {

    // Dunno why NSAutoreleasePool is needed but apparently it is

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // . . . my code

    [pool release];

}


}

2 个答案:

答案 0 :(得分:1)

我认为有一些问题,@ selector期望选择器不是方法调用。所以正确的应该是这样的

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    [NSThread detachNewThreadSelector:@selector(parseXML:) 
        toTarget:objXMLParser
        withObject:requestStr];

}

//here the taget is the object whose selector you are passing. so you can't use self there as parseXML: is the method of XMLParser class

// *** XMLParser.m ***

-(void)parseXML {

    // Dunno why NSAutoreleasePool is needed but apparently it is

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // . . . my code

    [pool release];

}

//需要自动释放池,因为它是一个单独的线程,你的代码可能会使用一些cocoa或你自己的调用/方法/代码来自动释放一个对象,这就是你必须为这些自动释放的对象保留一个自动释放池的原因。如果您的代码不使用任何[obj autorelease]语句或者在这种情况下不自动释放对象,则可以省略自动释放池语句,但保留它是一种很好的做法。

答案 1 :(得分:0)

我没有使用您描述的方法,但已使用NSOpertaions。它支持但并发和非并发操作,并且易于使用。