【问题标题】:== and isEqualsToString giving strange behavior [duplicate]== 和 isEqualToString 给出奇怪的行为[重复]
【发布时间】:2014-07-29 16:29:06
【问题描述】:

我有以下代码

NSString *firstName = @"1.6.1";
NSString *secondName = @"1.6.1";

if (!(firstName==secondName)) {
    NSLog(@"lock the app");
} else {
    NSLog(@"do not lock the app");
}

if (!([firstName isEqualToString:secondName])) {
    NSLog(@"lock the app");
} else {
    NSLog(@"do not lock the app");
}

我得到的输出是

do not lock the app
do not lock the app

但是,当我使用 firstNamesecondName 的实际值时,我得到的输出为

lock the app
do not lock the app

以下是firstNamesecondName的详细信息

 // this is coming from server
 firstName = [[NSUserDefaults standardUserDefaults] stringForKey:@"iPhoneAppVersion"];

 // this is coming from app version from iPhone
 secondName = [self appNameAndVersionNumberDisplayString];

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@",
            minorVersion];
}

如果我打印firstNamesecondName,我得到的值分别为1.6.11.6.1

知道为什么在使用 equals 时会有两个不同的输出吗?

【问题讨论】:

  • 在您从服务器收到的内容的开头/结尾处可能有一个(隐藏的)空格字符。也尝试记录字符串的长度。
  • @Cyrille :我检查过,长度相同,没有空格字符...

标签: objective-c nsstring equals


【解决方案1】:

==isEqualToString: 的行为会有所不同。因为==运算符只比较对象的地址,isEqualToString:会比较字符串值。

您不应该使用== 进行字符串比较。

【讨论】:

  • 我明白这一点,但为什么第一个代码可以工作?我在哪里手动分配值?
  • 常量字符串字面量(如@"1.6")在您多次使用时会被编译器赋予相同的内存地址。
  • 是的,常量字符串以不同的方式处理,如果你在一个地方使用常量,所有的地址都将具有相同的地址,因为编译器给了它们相同的内存地址。
猜你喜欢
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2021-05-16
  • 2016-11-05
  • 2019-11-11
  • 2023-03-03
相关资源
最近更新 更多