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