在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 函数的比较