【问题标题】:EXC_BAD_ACCESS while adding data to array, using 2 NSOperations simultaneouslyEXC_BAD_ACCESS 同时使用 2 个 NSOperations 向数组添加数据
【发布时间】:2011-02-09 08:17:34
【问题描述】:

我有:

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) 解析完成时 parser:didFinishParsing: 触发。

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。

【问题讨论】:

标签: iphone exc-bad-access nsoperation nsoperationqueue


【解决方案1】:

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

您可以查看有关线程不安全类的苹果文档。避免它的最好方法是使用 NSArray 对象。

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

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

【讨论】:

  • 感谢您的回答。不能解决问题...应用程序不断抛出 EXC_BAD_ACCESS。
  • 尝试清理构建并从项目目录中删除构建文件夹
【解决方案2】:

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

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

【讨论】:

  • @Walter\ Jablonowski 你能通过编辑同样的问题来发布代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多