在NSDictionary中设置和获取BOOL值

Cba*_*bas 1 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];
Run Code Online (Sandbox Code Playgroud)

在我班上的其他地方,我试图检索并比较像这样的booean值

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

我知道代码的两个部分都在运行,但是在输出的if语句中出现"EXC_BAD_ACCESS"错误:

<Error>: CGAffineTransformInvert: singular matrix.
Run Code Online (Sandbox Code Playgroud)

比较有什么问题吗?

我尝试这个时遇到同样的错误:

[toolStates setValue:[NSNumber numberWithBool:YES] forKey:@"X"];
Run Code Online (Sandbox Code Playgroud)

Con*_*ltz 12

你所写的内容存在一些问题,但我认为它们都不对你的直接问题负责(见下文).让我们来看看一些问题.

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

但是你得到的EXC_BAD_ACCESS通常意味着你正在访问一个解除分配的对象.我怀疑你得到的是与Core Graphics相关的错误,这与你的代码无关(建议你的垃圾指针现在指向图形相关的东西).

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

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