Jak sprawdzić, która klasa obiektu znajduje się w Objective-C?


207

Jak sprawdzić, czy obiekt jest instancją określonej klasy w Objective-C? Powiedzmy, że chcę zobaczyć, czy obiekt a jest instancją klasy b lub klasy c, jak mam to zrobić?

Odpowiedzi:


345

Aby sprawdzić, czy obiekt jest instancją klasy 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.

lub

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

Aby uzyskać nazwę klasy obiektu, możesz użyć NSStringFromClassfunkcji:

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

lub funkcja c z interfejsu API w czasie wykonywania celu-c:

#import <objc/runtime.h>

/* ... */

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

EDYCJA: W Swift

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

69
nie zapomnij o #import <objc / runtime.h> dla class_getName ()
Ovesh

6
Istnieje również metoda klasy .
Alexander Wallin

3
Rozumiem, że działa to tylko dla obiektów, które dziedziczą NSObject.
Henrik P. Hessel

1
@afEkenholm - ale nie na iOS 4.x, tylko tak wiemy.
JJ Rohrer

2
Jaka jest zaleta korzystania class_getNamez NSStringFromClass? Jeśli nie ma, odpowiedź należy dostosować.
Dan Rosenstark,

21

Możesz także użyć

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

na dowolnym obiekcie NSObject


8
Może to działać lub nie w zależności od tego, czy programista zastąpił metodę opisu. Jednak użycie [klasa obiektu] lub NSStringFromClass zawsze zwraca nazwę klasy.
futureelite7

1
Dobry do debugowania i wiedzieć, jaki typ jest twój tajemniczy obiekt!
M Jesse

3

Co oznacza o isKindOfClass w dokumentacji Apple

Zachowaj ostrożność podczas korzystania z tej metody na obiektach reprezentowanych przez klaster klas. Ze względu na naturę klastrów klas odzyskany obiekt może nie zawsze być zgodny z oczekiwaniami. W przypadku wywołania metody zwracającej klaster klas dokładny typ zwracany przez metodę jest najlepszym wskaźnikiem tego, co można zrobić z tym obiektem. Na przykład, jeśli metoda zwraca wskaźnik do obiektu NSArray, nie należy używać tej metody do sprawdzania, czy tablica jest modyfikowalna, jak pokazano w poniższym kodzie:

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

Jeśli użyjesz takich konstrukcji w swoim kodzie, możesz pomyśleć, że można modyfikować obiekt, który w rzeczywistości nie powinien być modyfikowany. Może to spowodować problemy z innym kodem, który oczekiwałby, że obiekt pozostanie niezmieniony.


Twój przykładowy kod jest nieprawidłowy. Będziesz miał problemy tylko wtedy, gdy będziesz testować pod kątem NSArray, który i tak jest niezmienny. Jeśli chcesz przetestować konkretną klasę, powinieneś użyć isMemberOfClass.
futureelite7

@ futureelite7 To jest przykład, jak nie testować typu klasy. W dokumentacji firmy Apple stwierdza, że -isKindOfClass:i -isMemberOfClass:nie powinny być wykorzystywane do identyfikacji obiektów w ramach klastra klasy.
pxpgraphics,

3

Jeśli chcesz sprawdzić konkretną klasę, możesz użyć

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

1

jeśli chcesz uzyskać nazwę klasy, po prostu zadzwoń:

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

0

Możesz także sprawdzić czas działania. Umieść jeden punkt przerwania w kodzie i zapisz w konsoli (lldb)

(lldb) po [yourObject class]

Lubię to..

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.