cocoa - 检查 NSString 实例是否包含在 NSArray 中

标签 cocoa nsstring nsarray

我有一个包含一堆字符串的数组,我想检查数组中是否包含某个字符串。如果我在数组上使用 containsObject: 消息,我会得到正确的结果。具有相同字符串的所有 NSString 对象是否都指向同一个对象?或者为什么 containsObject: 有效?

NSArray *stringArray = [NSArray arrayWithObjects:@"1",@"2",@"3",anotherStringValue, nil];
if([stringArray containsObject:@"2"]){
  //DO SOMETHING
}

最佳答案

是的,硬编码的 NSString(字符串文字)(即源代码中的任何 @"...")会转换为在进程运行时无限期存在的字符串。

但是,NSArraycontainsObject: 方法在其对象上调用 isEqual:,因此即使是动态创建的字符串 例如 [NSString stringWithFormat:@"%d", 2] 将在示例代码段中返回 YES
这是因为 NSString 的 isEqual: (或更准确地说是它的 isEqualToString:)方法被实现为内容感知(相对于比较指针身份)并且因此,对于任何包含完全相同的字符序列(在比较时)的字符串,都会返回 YES,无论它们是如何以及何时创建的。

要检查是否相等(指针)身份,您必须枚举数组并通过比较

NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
    if (someString == yourString) {
        identicalStringFound = YES;
        break;
    }
}

(不过,您很可能不想要这种情况)。

或者以更方便的方式:

BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;

(您很可能也不想要这个)。

<小时/>

总结:

因此,您从 containsObject: 获得肯定答复的原因是 NOT 因为文字字符串共享相同的常量实例,BUT 因为containsObject: 按照约定调用 isEqual:,它是内容感知的。

您可能想阅读 NSObject protocol 中的 isEqual: 的(简短)文档。 .

关于cocoa - 检查 NSString 实例是否包含在 NSArray 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5811121/

相关文章:

iphone - capitalizedString 将连字符后的单词大写?

ios - 按特定单词将 NSString 拆分为数组

Objective-C:在循环中从 NSString 中删除尾随逗号

iphone - 根据另一个数组中的对象从数组中删除特定对象

objective-c - NSButton 的弹出菜单实现

cocoa - 在 Cocoa 应用程序中安全地保存用户凭据

macos - '_' is not convertible to ' 字符串'

swift - 调整图像大小并保存到文件

ios - 如何以编程方式填充 switch case 值?

iphone - 使用 sortedArrayUsingFunction 对 NSArray 进行排序