Perbedaan iOS antara isKindOfClass dan isMemberOfClass

152

Apa perbedaan antara isKindOfClass:(Class)aClassdanisMemberOfClass:(Class)aClass fungsinya? Saya tahu ini adalah sesuatu yang kecil seperti, satu bersifat global sementara yang lainnya adalah pertandingan kelas yang tepat tetapi saya perlu seseorang untuk menentukan mana yang tolong.

Dalam Swift isKind(of aClass: AnyClass)dan isMember(of aClass: AnyClass).

NoodleOfDeath
sumber

Jawaban:

264

isKindOfClass:kembali YESjika penerima adalah turunan dari kelas yang ditentukan atau turunan dari kelas yang mewarisi dari kelas yang ditentukan.

isMemberOfClass:kembali YESjika, dan hanya jika, penerima adalah turunan dari kelas yang ditentukan.

Sebagian besar waktu yang ingin Anda gunakan isKindOfClass:untuk memastikan bahwa kode Anda juga berfungsi dengan subkelas.

The NSObject Referensi Protokol berbicara lebih banyak tentang metode ini.

Sebastian Celis
sumber
Bisakah Anda menghapus keraguan saya di bawah ini? if ([lbl.textColor isMemberOfClass: [kelas UIColor]]) {// Not Memeber NSLog (@ "Not Memeber"); } else {NSLog (@ "Not Memeber"); } if ([imgView.image isMemberOfClass: [UIImage class]]) {// Memeber NSLog (@ "Memeber"); } else {NSLog (@ "Not Memeber"); }
Nikkie
82
  • isKindOfClass:menunjukkan apakah suatu objek mewarisi dari kelas yang diberikan
  • isMemberOfClass:menunjukkan apakah suatu objek adalah turunan dari kelas yang diberikan.

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
jtbandes
sumber
@ Durga, jika ini menjawab pertanyaan Anda, Anda harus menerimanya. Baca lebih lanjut tentang menerima tarif di sini: meta.stackexchange.com/questions/16721/…
poncha
1
isKindOfClass juga akan mengembalikan YA jika objek adalah turunan dari kelas yang diberikan. Dengan kata lain isMemberOfClass adalah subset dari isKindOfClass.
Skuter
48

Seharusnya

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

kemudian

[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;

Pada dasarnya, -isMemberOfClass:itu benar jika turunannya persis dari kelas yang ditentukan, sedangkan -isKindOfClass:benar jika turunannya persis dari kelas yang ditentukan atau jika salah satu leluhur turunan adalah dari kelas yang ditentukan.

-isMemberOfClass: jarang digunakan.

kennytm
sumber
1
Tetapi jika Anda memiliki array subview yang mencakup UIViews dan UISegmentedControl dan Anda mengulanginya dan mengatur kondisional pada kelas yang akan Anda butuhkan adalahMemberOfClas UIView danMemberOfClass UISegmentedControl untuk membedakan keduanya, bukan? isKindOfClass akan melihat UISegmentedControl sebagai UIView.
PruitIgoe
@ Pilggoe itu sangat benar. Anda dapat menggunakan isKindOfClass: [kelas UIView] untuk memastikan bahwa semua objek yang Anda hadapi adalah UIViews tetapi Anda harus menggunakan isMemberOfClass: [kelas UIView] dan / atauMemberOfClass: [kelas UISegmentedControl] di dalam beberapa pernyataan kondisional untuk mengindikasikan setiap implementasi yang berbeda dari pandangan berdasarkan kelas instan langsung mereka
NoodleOfDeath
9

isKindOfClass : Mengembalikan nilai Boolean yang menunjukkan apakah penerima adalah turunan dari kelas yang diberikan atau turunan dari kelas yang mewarisi dari kelas itu.

isMemberOfClass : Mengembalikan nilai Boolean yang menunjukkan apakah penerima adalah turunan dari kelas yang diberikan.

Alex Terente
sumber
2

isKindOfClass-> mengembalikan YA ketika objek adalah turunan dari kelas itu atau turunan dari kelas yang diwarisi darinya.

isMemberOfClass: mengembalikan YA ketika objek adalah turunan dari kelas itu tetapi Tidak dalam kasus: turunan dari kelas yang diwarisi darinya.

Contoh cukup baik dalam jawaban jtbandes.

Ishu
sumber
0

Karena klaster kelas, isMemberOfClass dapat memberi Anda jawaban yang mungkin tidak Anda harapkan. Dalam banyak kasus, pilihan terbaik Anda kemungkinan besar adalah - (BOOL) conformToProtocol: (SEL) aSelector atau - (BOOL) conformsToProtocol: (Protocol *) aProtocol. Yaitu, lebih baik untuk menguji ini jika mereka dapat menjawab kebutuhan Anda daripada menguji kelas / subkelas.

Lihat apple doc untuk kelas dan protokol NSObject:

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/cl/NSObject

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intf/NSObject

Seni Swri
sumber