问题比较NSString文字和常数
问题描述:
我有一个NSString
,firstWord
,它的值为“第一”。它的定义是这样的:问题比较NSString文字和常数
NSString *firstWord = [[NSString alloc] init];
firstWord = [textView text];
然而,当我尝试检查它的价值,就像这样:
if (firstWord == @"First"){}
比较没有返回true,或者是我想在Objective-C。我知道它具有与字符串相同的值。所以,从this我很确定问题是我比较指针,这里不一样,即使字符串本身具有相同的值。那么我怎样才能直接比较字符串本身呢?或者更有效率,确保两个字符串对象做具有相同的指针,所以我不必做相对昂贵的字符串比较?
答
那么我怎么能直接比较字符串本身?
可可中的字符串比较是用isEqualToString:
完成的。
或许更有效,确保这两个字符串对象确实有相同的指针,
这是不可能的。一个是字符串字面值,存储在应用程序二进制文件的DATA部分;另一个是在你的应用堆上。在某些情况下(使用initWithString:@"literal string"
创建一个字符串),您最终会得到相同的地址,但您不应该依赖该地址。另外,您不需要 - 事实上不应该 - 因为您正在创建一个泄漏 - 在将文本视图的文本分配给指针之前分配一个字符串。
答
实际上有两个错误。
您的实际问题:
if (firstWord == @"First"){}
必须
if ([firstword compare:@"first"]==NSOrderedSame) ...
只有工作,如果firstword不为零。
另外:
NSString *firstWord = [[NSString alloc] init];
firstWord = [textView text];
这个失去记忆,因为你没有“复制” TextView的到字符串(这是不可能的呢,因为它是不可变的),你只需指定另一个字符串反对指针。所以你分配的空字符串会丢失。
只是做
NSString *firstWord;
firstWord = [textView text];
编辑:确保字符串具有相同的指针会更昂贵,因为你必须保持string对象和查找每串有一个表,所以你可以替换你的指针与“唯一”的一个或添加新的字符串表...
实际上,如果'firstWord'是'nil',则表达式将为真,因为消息的计算结果为0,与'NSOrderedSame'的值相同。 – 2012-07-09 06:29:01
这通常不是你想要的;在大多数情况下,开发人员将一个零字符串视为“不等于”某个实际字符串。 – 2012-07-09 06:35:12
Right;所以你会看到一个'nil'字符串,它似乎等于一些非'nil'字符串。因此,使用'isEqualToString:'。 – 2012-07-09 06:37:16