Yar*_*rin 82 cocoa objective-c string-comparison nsstring
以下比较均评估为真:
1)
@"foo" == @"foo";
Run Code Online (Sandbox Code Playgroud)
2)
NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
myString1 == myString2;
Run Code Online (Sandbox Code Playgroud)
但是,肯定有时候NSString使用等于运算符无法比较两个s,[myString1 isEqualToString:myString2]而是需要它.有人可以对此有所了解吗?
Jac*_*kin 162
之所以==奏效是因为指针比较.当你定义一个恒定的NSString使用@"",编译器uniquifies参考.当在代码中的其他位置定义相同的常量时,它们都将指向内存中的相同实际位置.
比较NSString实例时,您应该使用以下isEqualToString:方法:
NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%d", (myString2 == myString3)) //0
NSLog(@"%d", (myString1 == myString2)); //1
NSLog(@"%d", [myString1 isEqualToString:myString2]); //1
NSLog(@"%d", [myString1 isEqualToString:myString3]); //1
[myString3 release];
Run Code Online (Sandbox Code Playgroud)
编辑:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
Run Code Online (Sandbox Code Playgroud)
initWithString:不再创建新的参考,你需要initWithFormat,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
Run Code Online (Sandbox Code Playgroud)
Dav*_* M. 13
等号运算符==仅比较指针地址.使用文字@""语法创建两个相同的字符串时,编译器将检测它们是否相等,并且只存储一次数据.因此,两个指针指向同一位置.但是,由其他方法创建的字符串可能包含相同的数据,但存储在不同的存储位置.因此,在比较字符串时应始终使用isEqual:.
请注意,isEqual:并isEqualToString:始终返回相同的值,但isEqualToString:速度更快.
mip*_*adi 10
==比较内存中的位置.ptr == ptr2如果它们都指向相同的内存位置.这恰好适用于字符串常量,因为编译器碰巧使用一个实际字符串来表示相同的字符串常量.它不会,如果你有相同的内容变量的工作,因为他们会指向不同的内存位置; 使用isEqualToString在这样的情况下.
在Cocoa中,使用NSString的isEqualToString:方法比较字符串.
指针比较适用于您的情况,因为编译器足够温和,可以将两个字符串文字合并为一个对象.无法保证两个相同的字符串共享一个NSString实例.
| 归档时间: |
|
| 查看次数: |
97280 次 |
| 最近记录: |