【问题标题】:Issue comparing NSString literal and constant比较 NSString 文字和常量的问题
【发布时间】:2012-07-08 13:12:43
【问题描述】:

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

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

firstWord = [textView text];

但是,当我尝试检查它的值时,像这样:

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

比较不返回 true,或者我猜在 Objective-C 中是 YES。我知道它确实与字符串具有相同的值。因此,从this 开始,我很确定问题在于我正在比较指针,尽管字符串本身确实具有相同的值,但这里的指针并不相同。那么如何直接比较字符串本身呢?或者也许更有效,确保两个字符串对象 do 具有相同的指针,这样我就不必进行相对昂贵的字符串比较?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      实际上有两个错误。

      您的实际问题:

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

      需要

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

      仅当 firstword 不为零时才有效。

      另外:

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

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

      做吧

      NSString *firstWord;
      firstWord = [textView text];
      

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

      【讨论】:

      • 实际上,如果firstWordnil,则表达式为真,因为消息的计算结果为0,与NSOrderedSame 的值相同。
      • 这通常不是你想要的;在大多数情况下,开发人员会认为一个 nil 字符串“不等于”某个真实字符串
      • 对;所以你会有一个nil 字符串,它似乎等于一些非nil 字符串。因此,请使用isEqualToString:
      【解决方案3】:

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

          @property (nonatomic, strong) NSString *deviceModel;
      
          NSString *iPhoneSE = @"iPhone8,4";
          if ([self.deviceModel isEqualToString:iPhoneSE]) { // iPhone SE
              // layout code
          }
      

      【讨论】:

      • isEqualToString 已在接受的答案中提及。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      相关资源
      最近更新 更多