Wie teste ich, welche Klasse ein Objekt in Objective-C ist?


207

Wie teste ich, ob ein Objekt eine Instanz einer bestimmten Klasse in Objective-C ist? Angenommen, ich möchte sehen, ob Objekt a eine Instanz der Klasse b oder der Klasse c ist. Wie gehe ich vor?

Antworten:


345

So testen Sie, ob das Objekt eine Instanz der Klasse a ist:

[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.

oder

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

Um den Klassennamen des Objekts abzurufen, können Sie die folgende NSStringFromClassFunktion verwenden:

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

oder c-Funktion von Objective-C Runtime API:

#import <objc/runtime.h>

/* ... */

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

EDIT: In Swift

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

69
Vergessen Sie nicht, <objc / runtime.h> für class_getName ()
Ovesh

6
Hierfür gibt es auch eine Klassenmethode .
Alexander Wallin

3
Nach meinem Verständnis funktioniert dies nur für Objekte, die NSObject erben.
Henrik P. Hessel

1
@afEkenholm - aber nicht unter iOS 4.x, nur damit wir es wissen.
JJ Rohrer

2
Was ist der Vorteil class_getNamegegenüber NSStringFromClass? Wenn es keine gibt, sollte diese Antwort angepasst werden.
Dan Rosenstark

21

Sie können auch verwenden

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

auf jedem NSObject


8
Dies kann funktionieren oder nicht, je nachdem, ob der Programmierer die Beschreibungsmethode überschrieben hat. Bei Verwendung von [Objektklasse] oder NSStringFromClass wird jedoch immer der Klassenname zurückgegeben.
futureelite7

1
Gut zum Debuggen und um zu wissen, welcher Typ Ihr ​​mysteriöses Objekt ist!
M Jesse

3

Was bedeutet isKindOfClass in der Apple-Dokumentation ?

Seien Sie vorsichtig, wenn Sie diese Methode für Objekte verwenden, die von einem Klassencluster dargestellt werden. Aufgrund der Art der Klassencluster entspricht das Objekt, das Sie zurückerhalten, möglicherweise nicht immer dem Typ, den Sie erwartet haben. Wenn Sie eine Methode aufrufen, die einen Klassencluster zurückgibt, ist der genaue Typ, den die Methode zurückgibt, der beste Indikator dafür, was Sie mit diesem Objekt tun können. Wenn eine Methode beispielsweise einen Zeiger auf ein NSArray-Objekt zurückgibt, sollten Sie diese Methode nicht verwenden, um festzustellen, ob das Array veränderbar ist, wie im folgenden Code gezeigt:

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

Wenn Sie solche Konstrukte in Ihrem Code verwenden, denken Sie möglicherweise, dass es in Ordnung ist, ein Objekt zu ändern, das in Wirklichkeit nicht geändert werden sollte. Dies kann dann zu Problemen für anderen Code führen, der erwartet, dass das Objekt unverändert bleibt.


Ihr Beispielcode ist nicht korrekt. Sie werden nur dann auf Probleme stoßen, wenn Sie auf NSArray testen, das ohnehin unveränderlich ist. Wenn Sie für eine bestimmte Klasse testen möchten, sollten Sie stattdessen isMemberOfClass verwenden.
Futureelite7

@ futureelite7 Dies ist ein Beispiel dafür, wie man nicht auf Klassentypen testet . In der Apple-Dokumentation heißt es, dass -isKindOfClass:& -isMemberOfClass:nicht zum Identifizieren von Objekten innerhalb eines Klassenclusters verwendet werden sollte.
pxpgraphics

3

Wenn Sie nach einer bestimmten Klasse suchen möchten, können Sie verwenden

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

1

Wenn Sie den Namen der Klasse erhalten möchten, rufen Sie einfach an: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

0

Sie können auch die Laufzeit überprüfen. Setzen Sie einen Haltepunkt in den Code und schreiben Sie in die Konsole (lldb)

(lldb) po [yourObject class]

So was..

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.