2012-07-09 49 views
0

我有一个NSString,firstWord,它的值为“第一”。它的定义是这样的:问题比较NSString文字和常数

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

firstWord = [textView text]; 

然而,当我尝试检查它的价值,就像这样:

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

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

回答

2

那么我怎么能直接比较字符串本身?

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

或许更有效,确保这两个字符串对象确实有相同的指针,

这是不可能的。一个是字符串字面值,存储在应用程序二进制文件的DATA部分;另一个是在你的应用堆上。在某些情况下(使用initWithString:@"literal string"创建一个字符串),您最终会得到相同的地址,但您不应该依赖该地址。另外,您不需要 - 事实上不应该 - 因为您正在创建一个泄漏 - 在将文本视图的文本分配给指针之前分配一个字符串。

0

实际上有两个错误。

您的实际问题:

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

必须

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

只有工作,如果firstword不为零。

另外:

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

这个失去记忆,因为你没有“复制” TextView的到字符串(这是不可能的呢,因为它是不可变的),你只需指定另一个字符串反对指针。所以你分配的空字符串会丢失。

只是做

NSString *firstWord; 
firstWord = [textView text]; 

编辑:确保字符串具有相同的指针会更昂贵,因为你必须保持string对象和查找每串有一个表,所以你可以替换你的指针与“唯一”的一个或添加新的字符串表...

+0

实际上,如果'firstWord'是'nil',则表达式将为真,因为消息的计算结果为0,与'NSOrderedSame'的值相同。 – 2012-07-09 06:29:01

+0

这通常不是你想要的;在大多数情况下,开发人员将一个零字符串视为“不等于”某个实际字符串。 – 2012-07-09 06:35:12

+0

Right;所以你会看到一个'nil'字符串,它似乎等于一些非'nil'字符串。因此,使用'isEqualToString:'。 – 2012-07-09 06:37:16