【问题标题】:NSDictionary causing EXC_BAD_ACCESSNSDictionary 导致 EXC_BAD_ACCESS
【发布时间】:2010-06-16 22:20:53
【问题描述】:

我试图在 nsdictionary ivar 上调用 objectForKey:,但我收到 EXC_BAD_ACCESS 错误。 nsdictionary 是使用 JSON 框架创建的,然后被保留。我第一次使用它(就在我创建它之后,相同的运行循环)它工作得非常好,但是当我稍后尝试访问它时没有任何效果。我正在执行此代码以尝试找出问题所在:

if (resultsDic == nil) {
    NSLog(@"results dic is nil.");
}
if ( [resultsDic respondsToSelector:@selector(objectForKey:)] ) {
    NSLog(@"resultsDic should respond to objectForKey:");
}

字典永远不会是 nil,但它总是在 respondsToSelector 上崩溃。有什么想法吗?

补充: 除了上述之外,这些是字典与之交互的其他地方:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [connection release];

    //get the data in a usable form
    NSString *jsonString = [[NSString alloc] initWithData:downloadedData encoding:NSUTF8StringEncoding];
    resultsDic = [jsonString JSONValue];

    [self processResults];

    NSLog(@"Success. Received %d bytes of data",[downloadedData length]);
    [downloadedData release];
    [jsonString release];
}



- (void)processResults
{
        NSArray *resultsArr = [resultsDic objectForKey:@"results"];
                CLLocationCoordinate2D coordinate = [self coordinateFromResult:[resultsArr objectAtIndex:0]];
        NSLog(@"lat: %f lng: %f", coordinate.latitude, coordinate.longitude);
}

- (void)dealloc {
  [resultsDic release];
  [super dealloc];
}

【问题讨论】:

  • 您是否使用过调试器并验证resultsDic 仍然包含有效的引用/仍然是字典?
  • 它说有 0 个键/值对。但是他们怎么可能消失了,字典应该被保留?

标签: objective-c


【解决方案1】:

somethings 保留计数减少到 0 后,对象被释放。这与将其设置为 nil 不同。它不会是零。虽然您可以向 nil 发送消息,但向已释放对象发送消息将导致 EXC_BAD_ACCESS 错误。如果您发布一些创建和使用它的代码,也许我们可以帮助您调试它。尝试在开始时保留它两次。这不是一个优雅的解决方案,但它可以作为一种快速修复。

【讨论】:

  • 啊,谢谢你的解释。在创建后立即添加保留使其工作,现在我需要检查泄漏。僵尸工具对我来说是灰色的,但我也会让它运行
  • 根据泄漏仪器,字典没有泄漏。这是否意味着无论如何我都应该保留它并且我添加的保留是必要的?
  • 很有可能。如果每个人都遵循正确的规则,那么您取回的字典将被自动释放(这就是为什么您能够立即使用它,但后来它被释放了)。因此,如果您想保留它,请保留它。
【解决方案2】:

听起来像一个经典的僵尸。将环境变量 NSZombieEnabled 设置为 YES 再次运行它(或使用 Instruments.app 中的 Zombies 工具)。这应该会给你更多关于正在发生的事情的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 2016-11-19
    • 2012-10-02
    • 2011-04-14
    • 2017-03-15
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多