1

我有一个NSString, firstWord, 其值为“First”。它是这样定义的:

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

firstWord = [textView text];

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

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

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

4

3 回答 3

2

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

Cocoa 中的字符串比较是用isEqualToString:.

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

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

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

于 2012-07-09T06:28:06.717 回答
0

实际上有两个错误。

你的实际问题:

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

需要是

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

仅当 firstword 不为零时才有效。

此外:

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

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

做就是了

NSString *firstWord;
firstWord = [textView text];

编辑:确保字符串具有相同的指针会更加昂贵,因为您必须保留一个字符串对象表并在那里查找每个字符串,以便您可以用“唯一”替换您的指针或添加新字符串到桌子上……

于 2012-07-09T06:27:23.730 回答
-1

从 Swift 开始学习 Objective-C。这是我为每个 deviceModel 类型提供不同布局代码的方法。

    @property (nonatomic, strong) NSString *deviceModel;

    NSString *iPhoneSE = @"iPhone8,4";
    if ([self.deviceModel isEqualToString:iPhoneSE]) { // iPhone SE
        // layout code
    }
于 2021-09-04T06:29:37.877 回答