NSString: isEqual so với isEqualToString


94

Sự khác biệt giữa isEqual:và là isEqualToString:gì?

Tại sao các lớp thêm phương thức isEqualTo * (isEqualToArray cho NSArray, isEqualToData cho NSData, ...) thay vì chỉ ghi đè isEqual:?

Câu trả lời:


103

isEqual:so sánh một chuỗi với một đối tượng và sẽ trả về NOnếu đối tượng không phải là một chuỗi. isEqualToString:nhanh hơn nếu bạn biết cả hai đối tượng đều là chuỗi, như tài liệu chỉ rõ:

Cân nhắc đặc biệt

Khi bạn biết cả hai đối tượng là chuỗi, phương pháp này là một cách nhanh hơn để kiểm tra sự bình đẳng hơn isEqual:.

isEqualTo<Class>được sử dụng để cung cấp các kiểm tra cụ thể cho sự bình đẳng. Ví dụ; isEqualToArray:kiểm tra xem các mảng có chứa một số lượng đối tượng bằng nhau và các đối tượng tại một chỉ mục nhất định sẽ trả về YEScho isEqual:kiểm tra.


3
Nếu bạn tin rằng Aaron Hillegass thì không có sự khác biệt về hiệu suất, chỉ có một chút thuộc loại an toàn: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro

2
Cảm ơn vì liên kết - hữu ích. Mặc dù bạn đang yêu cầu chúng tôi tin Mark Dalrymple - người tôi tin :)
Abizern


16

Ngoài ra, để viết các phương thức -isEqual:và của riêng bạn -isEqualTo<Class>:, quy ước là cho phép các đối số nil -isEqual:và đưa ra một ngoại lệ cho các đối số nil để-isEqualTo<Class>:


1
Tôi đã không xem qua điều này trước đây, có tài liệu nào mà bạn biết không?
Mike Abdullah

2
Điều này dường như không đúng với isEqualToString, chỉ trả về NO nếu bạn vượt qua số không.
Jaka Jančar

9
Thật thú vị, nó được ghi lại trong phần So sánh đối tượng của <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Hướng dẫn cơ bản về các nguyên tắc cơ bản? "
Jonathan Dann

Đây không phải là sự thật. isEqualToString không nêu ra một ngoại lệ.
tôn trọngTheCode

1
Trang web Hướng dẫn các nguyên tắc cơ bản về ca cao cho biết, "Tài liệu này có thể không đại diện cho các phương pháp hay nhất để phát triển hiện tại." Nó cũ, rõ ràng.
cbh2000,

5

Tôi đoán rằng nó cung cấp một chút nâng cao hiệu suất, như isEqualToString: sẽ không phải nhập kiểm tra những gì được chuyển vào.


Đoán của bạn có lẽ là đúng :)
Philip007

5

Mở rộng trên các câu trả lời @Abizern và @Jonathan Dann, cả hai isEqualisEqualToStringhoạt động với nilcác giá trị.

- (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");
}

4

Tôi rất khuyên bạn nên điều này . Các lợi ích về hiệu suất của isEqualToString về cơ bản là không đáng kể đối với hầu hết các ứng dụng. Nhưng có hai điểm khác biệt mà tác giả đề cập:

  • Loại an toàn
  • Cách nilxử lý

Tôi không thấy bất kỳ sự khác biệt nào trong cách nil được xử lý bởi cả hai. Không phải là người nhận hoặc đối số hoặc cả hai.
SayeedHussain

Dù "cái này" không còn tồn tại nữa: /
Jared Grubb,

1
Cảm ơn @JaredGrubb, tôi đã tìm thấy URL mới.
Ben Packard,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.