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 不匹配?的主要内容,如果未能解决你的问题,请参考以下文章
保存自定义对象的 NSArrays 的 NSDictionary