Objective-C,为啥这些 NSArrays 不匹配?

Posted

技术标签:

【中文标题】Objective-C,为啥这些 NSArrays 不匹配?【英文标题】:Objective-C, why do these NSArrays not match?Objective-C,为什么这些 NSArrays 不匹配? 【发布时间】:2012-07-10 01:44:44 【问题描述】:

我有两个要比较的 NSArray — 在 NSLog 输出中它们看起来相同,但不知何故它们并不相等。如果我将 NSArray 转换为 NSString 我会得到相同的结果。将它们与自己进行比较将是平等的。如何确定为什么一和二不相等?谢谢。

- (void)confused:(NSArray *)two 

    NSArray *one = [NSArray arrayWithObjects:@"16777223", @"7", nil];
    NSArray *two = [[NSBundle bundleWithPath:@"/path/to/bundle"] executableArchitectures];

    // NSArray "two" shows as 16277223, 7 in NSLog

    if ([two firstObjectCommonWithArray:(NSArray *)one])
    
        NSLog(@"- it's equal %@ %@", one, two);
        // if array one matches array two then this will output
    
    else 
        NSLog(@"- it's NOT equal %@ %@", one, two);
    

    return;

这是控制台的输出:

myApp (
    16777223,
    7
)
myApp (
    16777223,
    7
)
myApp - it's NOT equal (
    16777223,
    7
)(
    16777223,
    7
)

【问题讨论】:

可否包括two的创建? 和我的另一个问题'[[NSBundle bundleWithPath:@"/path/to/bundle"] executableArchitectures]'直接相关;所以上面例子中 NSArray one 的值是@"16777223",@"7",nil 哦。该方法返回NSNumber 的数组,而不是NSString。那是你的问题。 是的,如果对象类型不同,即使它们产生相同的 description 转储,它们也不太可能进行相同的比较。 好的,我已经更新了如何创建 NSArray 2 的问题。所以问题真的是如何表示 NSArray 1 以使其等于 2? 【参考方案1】:

-[NSBundle executableArchitectures] 返回一个由NSNumber 对象组成的数组,而不是NSString 对象,因此您传入的数组中没有字符串。如果你改变了

NSArray *one = [NSArray arrayWithObjects:@"16777223",@"7", nil];

NSArray *one = [NSArray arrayWithObjects:[NSNumber numberWithUnsignedInteger:NSBundleExecutableArchitectureX86_64], 
                                         [NSNumber numberWithUnsignedInteger:NSBundleExecutableArchitectureI386], 
                  nil];

您的代码应该可以工作。

【讨论】:

哇,所以内置了 mach-o 部分?我不知道,很酷。我现在就试试——谢谢! 你的意思是NSBundleExecutableArchitectureX86_64?这些只是您导入的名称。它们在 NSBundle.h 中定义,就在声明 executableArchitectures 的上方。 当你像这样使用来自enum 的值时,总是最好用它们的名字而不是值来引用它们——它提高了可读性并防止值的可能变化(但不太可能)。 == 比较 NSArray 对象在内存中的位置;那些肯定不会相等。不过,firstObjectCommonWithArray:[one isEqual:two] 应该都可以工作。不是吗? firstObjectCommonWithArray :返回数组中第一个相同的对象,它不是用于相等检查。

以上是关于Objective-C,为啥这些 NSArrays 不匹配?的主要内容,如果未能解决你的问题,请参考以下文章

为啥说Objective-C很难学

为啥 Objective-C 很难

保存自定义对象的 NSArrays 的 NSDictionary

为啥 Xcode 不能识别这些着色器?

如何将 UIImages 和 NSArrays 存储在 CoreData 文件中?使用啥属性类型?

为啥 Objective-C 对象必须动态分配?