以下两种比较结果均为真:

1)

@"foo" == @"foo";

2)

NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
myString1 == myString2;

然而,在某些情况下,使用相等运算符无法比较两个NSString,而需要[myString1 isEqualToString:myString2].有人能解释一下吗?

推荐答案

==之所以有效是因为指针比较.使用@""定义常数NSString时,编译器会对引用进行唯一化.当在代码中的其他位置定义相同的常量时,它们都将指向内存中相同的实际位置.

比较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];

编辑:

NSString *myString3 = [[NSString alloc] initWithString:@"foo"]; 
// this is same with @"foo"

initWithString:不再创建新的引用,您需要initWithFormat

NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];

Objective-c相关问答推荐

当前周开始和结束日期

为什么 UITableViewCell Select 时所有背景都消失了?

在@implementation 而不是@interface 定义的类变量?

iOS 应用程序下一个键不会转到下一个文本字段

碰撞技术如何运作?

NSManagedObjectContext performBlockAndWait:不在后台线程上执行?

dispatch_semaphore_dispose 上的 EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

如何切换回已经加载的 UIViewController?

如何从 AVPlayer(不是 AVAudioPlayer)获取持续时间?

在我的 iOS Mail 和 Safari 应用程序中支持 Open In... 菜单项

何时应该使用 initWithNibName 初始化视图控制器?

NSManagedObjectContext:异常断点在 save: 方法处停止,但没有日志(log)/崩溃/错误

如何将@selector 作为参数传递?

UICollectionView 单元格 Select 和单元格重用

如何将小时数添加到 NSDate?

AdMob 因 [GADObjectPrivate changeState:] 崩溃:无法识别的 Select 器

在 32 位和 64 位架构上格式化 NS(U)Integer 时类型转换的替代方法?

在 UITextField 文本上投影

performFetchWithCompletionHandler 永远不会被解雇

使用 [NSDate date] 获取当前日期和时间