iOS:我是否必须将查找线程的NSAutoreleasePool中的结果复制到主线程?

时间:2011-11-15 00:49:17

标签: exc-bad-access nsthread nsautoreleasepool

我在我的iPad应用程序中生成一个从Web服务(SOAP)查找数据的线程。使用NSDictionary成员对象将响应解析为NSArray。如果我调用我的服务并同步解析,它会按预期工作。现在我必须启动后台线程,当查找线程释放其池并且我的主线程的UITableView尝试显示数据(调用reloadData)时,我从主线程中获取中止。

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    ^------------- Thread 1: Program received signal: EXC_BAD_ACCESS
    [pool release];
    return retVal;
}

我的猜测是解析后的结果已被池耗尽释放。我是否必须从一个区域复制到另一个区域?这是一个庞大的结构,深层复制将是昂贵的。

我还应该如何获得后台线程,以便在主线程中为我的UITableView安全地构建数据源?

2 个答案:

答案 0 :(得分:1)

您应该将对象保留在后台线程上,然后在完成使用后在主线程上将其释放。

答案 1 :(得分:0)

您可能需要在线程耗尽其池之前调用[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]以将结果传递回主线程。根据您的应用的结构,NSObject可能是您的viewControllerselector将成为viewController上的某种方法。