比较NSString文字和常量的问题

时间:2012-07-09 06:23:06

标签: objective-c string cocoa-touch nsstring string-literals

我有NSStringfirstWord,其值为“First”。它定义如下:

NSString *firstWord = [[NSString alloc] init];

firstWord = [textView text];

但是,当我尝试检查其值时,如下所示:

if (firstWord == @"First"){}

比较不会返回true,或者我猜是在Objective-C中。我知道它与字符串具有相同的值。所以,从this我很确定问题是我在比较指针,这些指针在这里不一样,即使字符串本身确实具有相同的值。那我怎么能直接比较字符串呢?或者更高效,确保两个字符串对象具有相同的指针,所以我不必进行相对昂贵的字符串比较吗?

2 个答案:

答案 0 :(得分:2)

  

那么如何直接比较字符串呢?

Cocoa中的字符串比较是使用isEqualToString:完成的。

  

或者更高效,确保两个字符串对象具有相同的指针

这是不可能的。一个是字符串文字,存储在应用程序二进制文件的DATA部分;另一个是在你的应用程序堆上。在某些情况下(使用initWithString:@"literal string"创建字符串),您最终会得到相同的地址,但您不应该依赖它。

顺便说一句,你不需要 - 事实上,不应该,因为你正在创建一个泄漏 - 在将文本视图的文本分配给指针之前分配一个字符串。

答案 1 :(得分:0)

实际上有两个错误。

您的实际问题:

if (firstWord == @"First"){}

需要

if ([firstword compare:@"first"]==NSOrderedSame) ...

仅在firstword不为零时才有效。

另外:

NSString *firstWord = [[NSString alloc] init];
firstWord = [textView text];

这会丢失内存,因为你没有将textview“复制”到字符串中(因为它不可变而无论如何都是不可能的),你只是将另一个字符串对象分配给指针。因此,您分配的空字符串将丢失。

只做

NSString *firstWord;
firstWord = [textView text];
编辑:确保字符串具有相同的指针会更加昂贵,因为您必须保留一个字符串对象表并查找每个字符串,以便您可以用“唯一”字符串替换指针或添加表格的新字符串......