EXC_BAD_ACCESS在向阵列添加数据时,同时使用2个NSOperations

时间:2011-02-09 08:17:34

标签: iphone exc-bad-access nsoperation nsoperationqueue

我有:

1)同时启动2个异步NSUrlRequests

2)只要两个请求中的一个加载了XML数据,就会使用NSOperationQueue来启动XML解析器。因此,ParseOperations的工作方式与Apple的LazyTableImages示例一样。

InfoRequestHelper.m

// ...

case GetBlogEntries:
{
    BlogParseOperation *parser = [[BlogParseOperation alloc] initWithXMLString:result delegate:self];
    parser.tag = helper.requestTag;

    [queue addOperation:parser]; // this will start the "ParseOperation"

    [parser release];

    break;
}
case GetTweets:
{
    TwitterParseOperation *parser = [[TwitterParseOperation alloc] initWithXMLString:result delegate:self];
    parser.tag = helper.requestTag;

    [queue addOperation:parser]; // this will start the "ParseOperation"

    [parser release];

    break;
}

// ...

3)解析完成后,解析器:didFinishParsing:fires。

InfoRequestHelper.m

- (void)parser:(ParseOperationBase *)parser didFinishParsing:(NSArray *)entries
{
    // Save data, remove completed request from list
    [self.requestsInProgress removeObjectForKey:parser.tag];
    [self.resultObjects addObjectsFromArray:entries];  // <= !!! EXC_BAD_ACCESS !!! here

    // ..    
}

问题:当第一个事件到达此处时,可以将对象添加到数组中。但是当第二个到达时,有一个EXC_BAD_ACCESS。

2 个答案:

答案 0 :(得分:1)

编辑: 我想你正试图在两种解析方法中访问resultObjects变量。和resultObjects是一个mutableArray。所以问题是当你试图从一个函数中添加或删除变量中的对象时,另一个函数也试图访问它。这会给你一个错误。我在创建多线程应用程序时也学到了这一点。

您可以在线程不安全的类上看到Apple文档。而避免它的最好方法是使用NSArray对象。

当您想要从变量中添加或删除对象时,您可以先将内容放入可变数组中并对其进行操作,然后将其分配回原始对象。

我希望这是有道理的。我知道找到这样的错误会有多难。

答案 1 :(得分:0)

如果您使用相同的数组填充数据,那么我认为您缺少基本的线程概念。 您不得在多个线程的写入模式下访问变量。

您应先在阵列上acquire a lock然后继续。