在NSDictionary中设置和获取BOOL值

时间:2012-08-08 22:22:02

标签: objective-c nsdictionary

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

我有一个像我这样创建的NSDictionary工具状态

NSArray *keys = [NSArray arrayWithObjects:@"X", @"Y", nil];
NSArray *isActive = [NSArray arrayWithObjects:[NSNumber numberWithBool:NO], [NSNumber numberWithBool:YES], nil];
toolStates = [NSDictionary dictionaryWithObjects:isActive forKeys:keys];
在我班上的其他地方,我正在尝试检索并比较像这样的booean值

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"];

1 个答案:

答案 0 :(得分:12)

你写的内容有几个问题,但我认为他们都不对你的直接问题负责(见下文)。我们来看几个问题。

  1. 您的[toolStates setValue:forKey:]无法按照书面形式运作,因为您有NSDictionary,而不是NSMutableDictionary
  2. -valueForKey:会返回id(即它将返回您的NSNumber个实例,而不是BOOL。因此,您的比较不正确。您的==正在做指针比较,这不是你想要的。(如果NSNumber被优化以从+numberWithBool:返回一个单身,那么可能在这里工作但这不是你应该依赖的行为。)在Objective-C中进行相等比较的正确方法是-isEqual:方法,例如if ([[toolStates valueForKey:@"X"] isEqual:[NSNumber numberWithBool:NO])
  3. 但是你得到的EXC_BAD_ACCESS通常意味着你正在访问一个解除分配的对象。我怀疑你得到一个与Core Graphics相关的错误,这与你的代码无关(建议你的垃圾指针现在指向图形相关的东西)。

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

    1. 通过Xcode静态分析器(Clang)运行代码。修复它抛出的任何警告。
    2. 在启用僵尸的情况下运行您的代码,并观察“发送到已解除分配的实例的消息”或类似的内容。