Iphone EXC_在向阵列添加数据时访问错误,同时使用2个NSU操作

Iphone EXC_在向阵列添加数据时访问错误,同时使用2个NSU操作,iphone,exc-bad-access,nsoperation,nsoperationqueue,Iphone,Exc Bad Access,Nsoperation,Nsoperationqueue,我有: 1) 同时启动2个异步NSURL请求 2) 一旦两个请求中的一个加载了XML数据,就会使用NSOperationQueue启动XML解析器。因此,解析操作的工作原理与苹果的LazyTableImages示例完全相同 InfoRequestHelper.m // ... case GetBlogEntries: { BlogParseOperation *parser = [[BlogParseOperation alloc] initWithXMLString:result d

我有:

1) 同时启动2个异步NSURL请求

2) 一旦两个请求中的一个加载了XML数据,就会使用NSOperationQueue启动XML解析器。因此,解析操作的工作原理与苹果的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;
}

// ...
- (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

    // ..    
}
3) 解析完成时,parser:didFinishParsing:fires

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;
}

// ...
- (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

    // ..    
}
-(void)parser:(ParseOperationBase*)parser didFinishParsing:(NSArray*)条目
{
//保存数据,从列表中删除已完成的请求
[self.requestsInProgress removeObjectForKey:parser.tag];
[self.resultObjects addObjectsFromArray:entries];//编辑:
我认为您试图在这两种解析方法中访问
resultObjects
变量。resultObjects是一个可变数组。因此,问题是当您试图从一个函数中添加或删除变量中的对象时,另一个函数也试图访问它。这将给您一个错误。当crea这是一个多线程应用程序

你可以看到苹果关于线程不安全类的文档。避免这种情况的最好方法是使用NSArray对象

当你想从你的变量中添加或删除一个对象时,你可以先把内容放到一个可变数组中,对它进行操作,然后把它分配回原来的对象


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

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


您应该先打开阵列,然后继续。

谢谢您的回答。这并不能解决问题…应用程序一直抛出EXC\u BAD\u访问。请尝试清除生成并从项目中删除生成文件夹directory@Walter\Jablonowski你能通过编辑同样的问题来发布代码吗?更新:这篇文章看起来很有趣:,转到试试这个。。。