gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:00:14 25 4
gpt4 key购买 nike

我有一个包含一堆字符串的数组,我想检查数组中是否包含某个字符串。如果我在数组上使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com