【问题标题】:isEqualToString MalfunctionisEqualToString 故障
【发布时间】:2012-07-31 08:12:49
【问题描述】:

好的,我有两个包含数字的字符串,如下所示使用调试器:

字符串 1

(gdb) po [event creator_id]
123456789
(gdb) p [event creator_id]
$1 = (NSString *) 0xad81d10

字符串 2

(gdb) po [delegate userid]
123456789
(gdb) p [delegate userid]
$2 = (NSString *) 0x7451b40

现在我想检查它们是否彼此相等,这就是问题所在。

下面的 if 语句由于某种原因不会返回 true:

if ([[delegate userid] isEqualToString: [event creator_id]]) {

    NSLog(@"They are equal!");

}

有人可以向我解释一下这是怎么发生的吗?感谢您的宝贵时间!

【问题讨论】:

  • 是否有可能出现尾随空格?
  • 是 [[delegate userid] isKindOfClass:[NSString class]] == YES && [[event creator_id] isKindOfClass:[NSString class]] == YES
  • 仔细检查是否没有空格或不可见字符,也许?
  • 仔细检查!给我一秒钟!
  • @MSK 似乎 [event creator_id] 并不是真正的 NSString。但是,如果它真的不是,为什么它会在调试器中显示为一个呢?未导致错误的失败转换??

标签: iphone objective-c ios


【解决方案1】:

这可能是因为以下任何一个都是 FALSE

[[delegate userid] isKindOfClass:[NSString class]]

[[event creator_id] isKindOfClass:[NSString class]]

po 是“打印对象”,它打印对象的描述(字符串)。 description 属性在 NSObject 级别可用。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    许多方法返回一个id,可以将其分配给任何NSObject 指针,而不会产生编译器错误或警告。而gdb“p”命令只使用源代码生成的类型信息,并不能确定运行时的实际类。

    例子:

    NSString *s;
    s = [NSArray arrayWithObject:@"Hello World"];
    

    在调试器中:

    (gdb) po s
    <__NSArrayI 0x8ec70a0>(
    Hello World
    )
    
    (gdb) p s
    $1 = (NSString *) 0x8ec70a0
    

    所以“po”知道实际的类,但“p”不知道。

    【讨论】:

    • 谢谢你的解释:)!
    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多