1

我需要一个指向布尔值的字符串字典。

我有一个像这样创建的 NSDictionary toolStates

NSArray *keys = [NSArray arrayWithObjects:@"X", @"Y", nil];
NSArray *isActive = [NSArray arrayWithObjects:[NSNumber numberWithBool:NO], [NSNumber numberWithBool:YES], nil];
toolStates = [NSDictionary dictionaryWithObjects:isActive forKeys:keys];

在我班的其他地方,我正在尝试检索和比较这样的布尔值

if ([toolStates valueForKey: @"X"] == [NSNumber numberWithBool:NO]) NSLog(@"%s", "X = NO");

我知道这两个部分的代码都在运行,但我在 if 语句中收到“EXC_BAD_ACCESS”错误,并输出:

<Error>: CGAffineTransformInvert: singular matrix.

比较有什么问题吗?

当我尝试这个时,我得到了同样的错误:

[toolStates setValue:[NSNumber numberWithBool:YES] forKey:@"X"];
4

1 回答 1

12

您所写的内容存在一些问题,但我认为它们都不是您当前问题的原因(见下文)。让我们来看看几个问题。

  1. [toolStates setValue:forKey:]不能像书面的那样工作,因为你有一个NSDictionary,不是NSMutableDictionary
  2. -valueForKey:返回id(即它将返回您的NSNumber实例,而不是BOOL. 因此,您的比较不正确。您==正在进行指针比较,这不是您想要的。(如果优化为返回单例,它可能在这里工作,但那不是行为你应该指望。)在Objective-C中进行相等比较的正确方法是方法,例如.NSNumber+numberWithBool:-isEqual:if ([[toolStates valueForKey:@"X"] isEqual:[NSNumber numberWithBool:NO])

但是你得到了EXC_BAD_ACCESS这通常意味着你正在访问一个被释放的对象。我的怀疑是因为您收到与核心图形相关的错误,这与您的代码无关(表明您的垃圾指针现在指向与图形相关的东西)。

你在用ARC吗?如果没有,我认为您不会toolStates在任何地方保留。如果您不是,并且您在运行循环的下一轮(听起来像)之后访问它,那么您会期望崩溃。如果这听起来不正确,或者您找不到问题,请尝试以下操作:

  1. 通过 Xcode 静态分析器 (Clang) 运行您的代码。修复它向您抛出的任何警告。
  2. 在启用僵尸的情况下运行您的代码,并注意“发送到已释放实例的消息”或类似的东西。
于 2012-08-08T22:54:06.867 回答