Bagaimana cara menguji kelas objek mana yang ada di Objective-C?


207

Bagaimana saya menguji apakah suatu objek adalah turunan dari kelas tertentu di Objective-C? Katakanlah saya ingin melihat apakah objek a adalah turunan dari kelas b, atau kelas c, bagaimana cara saya melakukannya?

Jawaban:


345

Untuk menguji apakah objek adalah turunan dari kelas a:

[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of 
// given class or an instance of any class that inherits from that class.

atau

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

Untuk mendapatkan nama kelas objek, Anda dapat menggunakan NSStringFromClassfungsi:

NSString *className = NSStringFromClass([yourObject class]);

atau c-function dari api runtime objektif-c:

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

EDIT: Dalam Swift

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

69
jangan lupa untuk mengimport <objc / runtime.h> untuk class_getName ()
Ovesh

6
Ada juga metode kelas untuk ini.
Alexander Wallin

3
Pemahaman saya adalah ini hanya berfungsi untuk objek yang mewarisi NSObject.
Henrik P. Hessel

1
@afEkenholm - tetapi tidak di iOS 4.x, asal kami tahu.
JJ Rohrer

2
Apa keuntungan menggunakan class_getNamelebih NSStringFromClass? Jika tidak ada, jawaban ini harus disesuaikan.
Dan Rosenstark

21

Anda juga bisa menggunakannya

NSString *className = [[myObject class] description]; 

pada setiap NSObject


8
Ini mungkin atau mungkin tidak bekerja berdasarkan pada apakah programmer telah menimpa metode deskripsi. Menggunakan [kelas objek] atau NSStringFromClass selalu mengembalikan nama kelas.
futureelite7

1
Baik untuk debugging dan mengetahui jenis objek misteri Anda!
M Jesse

3

Apa artinya tentang isKindOfClass di Apple Documentation

Hati-hati saat menggunakan metode ini pada objek yang diwakili oleh gugus kelas. Karena sifat cluster kelas, objek yang Anda dapatkan kembali mungkin tidak selalu menjadi tipe yang Anda harapkan. Jika Anda memanggil metode yang mengembalikan cluster kelas, tipe yang tepat dikembalikan oleh metode adalah indikator terbaik dari apa yang dapat Anda lakukan dengan objek itu. Misalnya, jika metode mengembalikan pointer ke objek NSArray, Anda tidak boleh menggunakan metode ini untuk melihat apakah array bisa berubah, seperti yang ditunjukkan dalam kode berikut:

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

Jika Anda menggunakan konstruksi seperti itu dalam kode Anda, Anda mungkin berpikir tidak apa-apa untuk memodifikasi objek yang pada kenyataannya tidak boleh dimodifikasi. Melakukan hal itu dapat menimbulkan masalah bagi kode lain yang mengharapkan objek tetap tidak berubah.


Contoh kode Anda tidak benar. Anda hanya akan mengalami masalah jika Anda menguji NSArray, yang tetap saja. Jika Anda ingin menguji untuk kelas tertentu, Anda harus menggunakan isMemberOfClass sebagai gantinya.
futureelite7

@ futureelite7 Ini adalah contoh bagaimana tidak menguji tipe kelas. The Apple dokumentasi menyatakan bahwa -isKindOfClass:& -isMemberOfClass:tidak boleh digunakan untuk mengidentifikasi objek dalam cluster kelas.
pxpgraphics

3

Jika Anda ingin memeriksa kelas tertentu maka Anda dapat menggunakannya

if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}

1

jika Anda ingin mendapatkan nama kelas cukup hubungi: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);

0

Anda juga dapat memeriksa waktu berjalan. Masukkan satu breakpoint dalam kode dan di dalam (lldb) konsol tulis

(lldb) po [yourObject class]

Seperti ini..

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.