在Objective C中比较NSString

Posted

技术标签:

【中文标题】在Objective C中比较NSString【英文标题】:Comaparing NSString in Objective C 【发布时间】:2016-04-22 11:37:35 【问题描述】:

任何人请帮助我理解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

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

【问题讨论】:

***.com/questions/14036604/… 使用 -isEqualToString: 方法比较两个字符串的值。使用 C == 运算符将简单地比较对象的地址。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

你需要使用NSString类的下面的实例方法。

- (BOOL)isEqualToString:(NSString *)aString;

所以,在你的情况下,只需遵循以下:

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

通过(strNew == strNew4)

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

【讨论】:

【参考方案3】:

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

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

在大多数情况下,使用 == 并不是您想要的。但是,什么是合适的取决于您的目标。

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

    

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

    

【讨论】:

【参考方案4】:

记住 isEqualToString: 带有警告

[string1 isEqualToString: string2]

如果两个字符串都为 nil,将有效地返回 false。

【讨论】:

以上是关于在Objective C中比较NSString的主要内容,如果未能解决你的问题,请参考以下文章

从Objective C中的NSArray转换时如何比较String?

Objective C - iPhone 比较 2 个 CLLocations /GPS 坐标

Objective C IRR 计算与 Excel IRR 函数的比较

Objective C / iPhone比较2 CLLocations /GPS坐标

Objective-C - 比较整数不能按预期工作

Objective-C 和 Java 很像,区别在哪儿