【问题标题】:NSString: isEqual vs. isEqualToStringNSString:isEqual 与 isEqualToString
【发布时间】:2010-11-20 13:00:04
【问题描述】:

isEqual:isEqualToString: 有什么区别?

为什么类要添加 isEqualTo* 方法(isEqualToArray 用于 NSArray,isEqualToData 用于 NSData,...)而不是仅仅覆盖 isEqual:

【问题讨论】:

    标签: objective-c iphone cocoa nsstring


    【解决方案1】:

    isEqual: 将字符串与对象进行比较,如果对象不是字符串,则返回 NO。如果您知道两个对象都是字符串,isEqualToString: 会更快,正如documentation 所述:

    特殊注意事项

    当您知道两个对象都是字符串时,此方法是一种比 isEqual: 更快的检查相等性的方法。

    isEqualTo<Class> 用于提供特定的相等性检查。例如; isEqualToArray: 检查数组是否包含相同数量的对象,以及给定索引处的对象是否为 isEqual: 测试返回 YES

    【讨论】:

    【解决方案2】:

    另外,对于编写自己的 -isEqual:-isEqualTo<Class>: 方法,约定是允许 -isEqual: 使用 nil 参数,并为 -isEqualTo<Class>: 引发 nil 参数异常

    【讨论】:

    • 我以前没有遇到过这个,你知道有什么文档吗?
    • isEqualToString 似乎不是这样,如果你传入 nil,它只会返回 NO。
    • 有趣,它记录在 developer.apple.com/documentation/Cocoa/Conceptual/… 基础指南的对象比较部分
    • 这不是真的。 isEqualToString 不会引发异常。
    • Cocoa 基础指南网页说:“本文档可能不代表当前开发的最佳实践。”很明显,它很旧。
    【解决方案3】:

    我的猜测是它提供了轻微的性能增强,因为 isEqualToString: 不必对传入的内容进行类型检查。

    【讨论】:

    • 你的猜测可能是真的:)
    【解决方案4】:

    扩展 @Abizern 和 @Jonathan Dann 的答案,isEqualisEqualToString 都使用 nil 值。

    - (void)testStringEqual {
        NSString *string = nil;
    
        STAssertFalse([string isEqual:@"test"], @"NSString isEqual");
        STAssertFalse([string isEqualToString:@"test"], @"NSString isEqualToString");
    
        // Note that these both return NO
        STAssertFalse([string isEqual:nil], @"NSString isEqual");
        STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");
    
        string = @"test";
    
        STAssertTrue([string isEqual:@"test"], @"NSString isEqual");
        STAssertTrue([string isEqualToString:@"test"], @"NSString isEqualToString");
    
        STAssertFalse([string isEqual:nil], @"NSString isEqual");
        STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");
    }
    

    【讨论】:

      【解决方案5】:

      我强烈推荐this。对于大多数应用程序来说,isEqualToString 的性能优势基本上可以忽略不计。但作者还提到了另外两个区别:

      • 类型安全
      • nil 的处理方式

      【讨论】:

      • 我看不出两者处理 nil 的方式有什么不同。零成为接收者或论点或两者兼而有之。
      • 无论什么“这个”不再存在:/
      • 感谢@JaredGrubb,我找到了新网址。
      猜你喜欢
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2015-02-18
      相关资源
      最近更新 更多