我需要一个指向布尔值的字符串字典。
我有一个像我这样创建的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"];
答案 0 :(得分:12)
你写的内容有几个问题,但我认为他们都不对你的直接问题负责(见下文)。我们来看几个问题。
[toolStates setValue:forKey:]
无法按照书面形式运作,因为您有NSDictionary
,而不是NSMutableDictionary
。-valueForKey:
会返回id
(即它将返回您的NSNumber
个实例,而不是BOOL
。因此,您的比较不正确。您的==
正在做指针比较,这不是你想要的。(如果NSNumber
被优化以从+numberWithBool:
返回一个单身,那么可能在这里工作但这不是你应该依赖的行为。)在Objective-C中进行相等比较的正确方法是-isEqual:
方法,例如if ([[toolStates valueForKey:@"X"] isEqual:[NSNumber numberWithBool:NO])
。但是你得到的EXC_BAD_ACCESS
通常意味着你正在访问一个解除分配的对象。我怀疑你得到一个与Core Graphics相关的错误,这与你的代码无关(建议你的垃圾指针现在指向图形相关的东西)。
你在使用ARC吗?如果没有,我认为你不会在任何地方保留toolStates
。如果你不是,并且在下一轮运行循环(听起来像)后你正在访问它,那么你会发现崩溃。如果这听起来不对,或者您找不到问题,请尝试以下操作: