Come testare la classe di un oggetto in Objective-C?


207

Come posso verificare se un oggetto è un'istanza di una particolare classe in Objective-C? Diciamo che voglio vedere se l'oggetto a è un'istanza di classe b, o classe c, come posso fare per farlo?

Risposte:


345

Per verificare se l'oggetto è un'istanza di classe 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.

o

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

Per ottenere il nome della classe dell'oggetto è possibile utilizzare la NSStringFromClassfunzione:

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

o funzione c da api runtime obiettivo-c:

#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
non dimenticare di #import <objc / runtime.h> per class_getName ()
Ovesh

6
C'è anche un metodo di classe per questo.
Alexander Wallin,

3
La mia comprensione è che questo funziona solo per oggetti che ereditano NSObject.
Henrik P. Hessel,

1
@afEkenholm - ma non su iOS 4.x, solo per questo lo sappiamo.
JJ Rohrer,

2
Qual è il vantaggio dell'utilizzo di class_getNameover NSStringFromClass? Se non ce n'è nessuno, questa risposta dovrebbe essere adattata.
Dan Rosenstark,

21

Puoi anche usare

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

su qualsiasi oggetto NSO


8
Ciò può funzionare o meno in base al fatto che il programmatore abbia ignorato il metodo di descrizione. L'uso di [classe oggetto] o NSStringFromClass restituisce comunque sempre il nome della classe.
futureelite7

1
Buono per il debug e sapere di che tipo è il tuo oggetto misterioso!
M Jesse,

3

Cosa significa isKindOfClass nella documentazione Apple

Prestare attenzione quando si utilizza questo metodo su oggetti rappresentati da un cluster di classi. A causa della natura dei cluster di classe, l'oggetto restituito potrebbe non essere sempre il tipo previsto. Se si chiama un metodo che restituisce un cluster di classe, il tipo esatto restituito dal metodo è l'indicatore migliore di ciò che è possibile fare con quell'oggetto. Ad esempio, se un metodo restituisce un puntatore a un oggetto NSArray, non si dovrebbe usare questo metodo per vedere se l'array è mutabile, come mostrato nel codice seguente:

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

Se usi tali costrutti nel tuo codice, potresti pensare che sia giusto modificare un oggetto che in realtà non dovrebbe essere modificato. Ciò potrebbe quindi creare problemi per altri codici che prevedevano che l'oggetto rimanesse invariato.


Il tuo codice di esempio non è corretto. Incontrerai problemi solo se esegui il test per NSArray, che è comunque immutabile. Se si desidera verificare una classe specifica, utilizzare invece isMemberOfClass.
futureelite7,

@ futureelite7 Questo è un esempio di come non testare il tipo di classe. La documentazione Apple afferma che -isKindOfClass:e -isMemberOfClass:non dovrebbero essere utilizzati per identificare oggetti all'interno di un cluster di classi.
pxpgraphics,

3

Se si desidera verificare una classe specifica, è possibile utilizzare

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

1

se vuoi ottenere il nome della classe chiama semplicemente: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

0

Puoi anche controllare il tempo di esecuzione. Inserire un punto di interruzione nel codice e scrivere all'interno della console (lldb)

(lldb) po [yourObject class]

Come questo..

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.