比较 Objective C 中的 NSString

Comaparing NSString in Objective C

任何人都请帮助我理解 Objective-C

中的字符串比较技术
NSString *strNew1 = @"AA";
NSString *strNew2 = @"AA";

所以为了比较我们可以使用的两个字符串,

   Method 1. if (strNew1 == strNew2) {
          NSLog(@"Equal");
      }

Method 2:  if ([strNew1 isEqualToString:strNew2]) {
           NSLog(@"Equal");
       }

在这种情况下,他们都成功了。但我知道方法 1 在某些其他情况下会失败。我也尝试了以下条件(全部成功)。

NSString *strNew = @"AA";
NSString *strNew1 = @"AA";
NSString *strNew11 = [[NSString alloc] initWithString:strNew1];
NSString *strNew3 = strNew;
NSArray *arr = @[@"AA"];
NSString *strNew4 = [arr objectAtIndex:0];
NSString *strNew5 = [arr objectAtIndex:0];
_test = strNew5;
_test1 = @"AA";
if ([strNew isEqualToString:strNew1]) {
    NSLog(@"Equal");
}

if (strNew == strNew3) {
     NSLog(@"Equal1");
}

if (strNew == [arr objectAtIndex:0]){
     NSLog(@"Equal2");
}

if (strNew == strNew4){
    NSLog(@"Equal3");
}

if (strNew5 == strNew4){
    NSLog(@"Equal4");
}

if (strNew4 == [arr objectAtIndex:0]){
    NSLog(@"Equal5");
}

if (strNew11 == [arr objectAtIndex:0]){
    NSLog(@"Equal11");
}

if (self.test == strNew4){
    NSLog(@"Equal3");
}

if (self.test == self.test1){
    NSLog(@"Equal3");
}

TEST *test = [TEST new]; // Tried with a class with NSString property with value "AA" . (test.strTest value is @"AA")
if (strNew == test.strTest) {
   NSLog(@"Equal"); //success
}

我知道他们中的大多数都是多余的。我无法理解这背后的基础知识。请任何人对此背后的概念给出明确的解释。谢谢。

您需要使用以下 NSString class.

的实例方法
- (BOOL)isEqualToString:(NSString *)aString;

因此,对于您的情况,只需按照以下步骤操作:

if ([strNew isEqualToString strNew4]){
    NSLog(@"Equal3");
}

通过 (strNew == strNew4),

您只是在比较对象的地址。

在您定义的情况下,创建的字符串在内部被视为字符串文字。运行时不会为此类字符串分配不同的内存space。

基本上所有包含相同字符串文字的字符串("AA" 在您的情况下)将指向相同的内存位置。这是 Apple 内存优化的一部分。

当您更改任何字符串的值时(比如 "AB"),一个新地址将分配给该 NSString 对象,然后 == 将失败。

第一种比较指针,第二种比较对象。

即第一种方式比较指针是否具有相同的值。在这种情况下,它们很可能不会,在第二种情况下,将比较对象。由于它们的初始化方式相同,因此它们可能相等。 (注意,似乎 UIButton 的 isEqual 实现:结果总是 false。)

在大多数情况下,使用 == 并不是您想要的。然而,什么是合适的取决于你的 objective.

if (strNew1 == strNew2) //This compared your pointers
    {

    }

 if ([strNew1 isEqualToString:strNew2]) //Compares NSString object
    {

    }

请记住 isEqualToString: 带有警告

[string1 isEqualToString: string2]

将有效 return false 两个字符串都是 nil。