NSString: isEqual vs. isEqualToString

94

Apa perbedaan antara isEqual:dan isEqualToString:?

Mengapa kelas menambahkan metode isEqualTo * (isEqualToArray untuk NSArray, isEqualToData untuk NSData, ...) alih-alih hanya menimpa isEqual:?

Jaka Jančar
sumber

Jawaban:

103

isEqual:membandingkan string ke objek, dan akan mengembalikan NOjika objek tersebut bukan string. isEqualToString:lebih cepat jika Anda mengetahui kedua objek tersebut adalah string, seperti yang dinyatakan dalam dokumentasi :

Pertimbangan Khusus

Jika Anda mengetahui bahwa kedua objek adalah string, metode ini adalah cara yang lebih cepat untuk memeriksa persamaan daripada isEqual:.

isEqualTo<Class>digunakan untuk memberikan pemeriksaan khusus untuk kesetaraan. Misalnya; isEqualToArray:memeriksa bahwa array berisi jumlah objek yang sama, dan bahwa objek pada indeks tertentu kembali YESuntuk isEqual:pengujian.

Abizern
sumber
3
Jika Anda yakin Aaron Hillegass maka tidak ada perbedaan kinerja, hanya sedikit jenis keselamatan: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro
2
Terima kasih untuk tautannya - berguna. Meskipun Anda meminta kami untuk mempercayai Mark Dalrymple - yang saya lakukan :)
Abizern
16

Selain itu, untuk menulis sendiri -isEqual:dan -isEqualTo<Class>:metode Anda, konvensi adalah mengizinkan nihil argumen untuk -isEqual:dan memunculkan pengecualian untuk argumen nil untuk-isEqualTo<Class>:

Jonathan Dann
sumber
1
Saya belum pernah menemukan ini sebelumnya, dokumentasi apa saja yang Anda ketahui?
Mike Abdullah
2
Ini tampaknya tidak benar untuk isEqualToString, yang hanya mengembalikan NO jika Anda meneruskan nil.
Jaka Jančar
9
Menarik, ini didokumentasikan di bagian Perbandingan Objek di <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Panduan Dasar</i>
Jonathan Dann
Ini tidak benar. isEqualToString tidak memunculkan pengecualian.
respekTheCode
1
Halaman web Panduan Dasar Kakao mengatakan, "Dokumen ini mungkin tidak mewakili praktik terbaik untuk pengembangan saat ini." Sepertinya sudah tua.
cbh2000
5

Dugaan saya adalah ini memberikan sedikit peningkatan kinerja, karena isEqualToString: tidak perlu memeriksa jenis apa yang diteruskan.

iKenndac
sumber
Tebakan Anda mungkin benar :)
Philip007
5

Memperluas jawaban @Abizern dan @Jonathan Dann, keduanya isEqualdan isEqualToStringbekerja dengan nilnilai.

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

Saya sangat merekomendasikan ini . Manfaat kinerja isEqualToString pada dasarnya dapat diabaikan untuk sebagian besar aplikasi. Tetapi ada dua perbedaan lain yang disebutkan penulis:

  • Ketik keamanan
  • Cara nilditangani
Ben Packard
sumber
Saya tidak melihat perbedaan dalam cara nihil ditangani oleh keduanya. Nihil menjadi penerima atau argumen atau keduanya.
SayeedHussain
Apapun "ini" sudah tidak ada lagi: /
Jared Grubb
1
Terima kasih @JaredGrubb, saya menemukan URL baru.
Ben Packard