NSMutableArray 中的 BOOL 给出了错误的答案

BOOL inside of NSMutableArray gives wrong answer

我有一个包含 BOOL 的 NSMutableArray。通过以下方式添加元素:

addObject:@[@YES, sectionInfo.header, myFeedSource.header

然后我按如下方式遍历数组:

    for (int i=0; i<revealController.headersSelected.count; i++) {
        isActive = [revealController.headersSelected[i][0] boolValue];
        MLog(@"Active %@",revealController.headersSelected[i][0]);
        MLog(@"class %@",[revealController.headersSelected[i][0] class]);
        MLog(@"converted %d",[revealController.headersSelected[i][0] boolValue]);
        if (isActive) {
            MLog(@"Yes");
        }else {
            MLog(@"No");
        }
        if (revealController.headersSelected[i][0]) {
            MLog(@"Yes");
        }else {
            MLog(@"No");
        }
        if (revealController.headersSelected[i][0]>0) {
            MLog(@"Yes");
        }else {
            MLog(@"No");
        }

输出为:

Active 0
class __NSCFBoolean
converted 0
No
Yes
Yes

我可以让它看到子元素的正确值的唯一方法是将其转换为 var:

        isActive = [revealController.headersSelected[i][0] boolValue];

此 BOOL 的值通过 replaceObjectAtIndex:

在 For..Next 循环内设置

我在这里错过了什么?为什么它看不到 BOOL 的正确值?

前后打印了整个数组,值从1变成0。

对您的输出的评论:

Active 0              This is truth
class __NSCFBoolean   This is truth
converted 0           This is truth
No                    This is truth
Yes      This is a lie, because you're testing for pointer existence
Yes      This is a lie, because you're testing the pointer isn't a zero

所以,我猜你正在编辑的东西有时是一个副本,而不是将其更新回你的数据结构,和/或你需要小心解包 NSNumber 实例。

您只能将对象存储在 NSArray 中,不能像 BOOL 这样的内部类型。 @YES 是 shorthand 的表达方式 [NSNumber numberWithBool:YES] - 即您正在创建一个具有所需布尔值的 NSNumber 对象。

NSNumber 是一个 class 集群,因此它会选择合适的子class 来存储您的值。在本例中,它是一个 NSCFBoolean。为了访问布尔值,您需要使用所示的 boolValue 方法。